gray@elemental: ~$ aptitude search opengl
p gambas2- gb- opengl - The OpenGL component for Gambas
p gambas2- gb- opengl: i386 - The OpenGL component for Gambas
p gambas2- gb- qt- opengl - OpenGL with QT toolkit Gambas component
p gambas2- gb- qt- opengl: i386 - OpenGL with QT toolkit Gambas component
p gnash- common- opengl - dummy package for gnash- common- opengl remo
p gnash- opengl - dummy package for gnash- opengl removal
p klash- opengl - dummy package for klash- opengl removal
p libghc- opengl- dev - Haskell OpenGL binding for GHC
p libghc- opengl- dev: i386 - Haskell OpenGL binding for GHC
v libghc- opengl- dev- 2.2.3.1- 2a936 -
v libghc- opengl- dev- 2.2.3.1- d355c -
p libghc- opengl- doc - Haskell OpenGL binding for GHC; documentat
p libghc- opengl- prof - Haskell OpenGL binding for GHC; profiling
p libghc- opengl- prof: i386 - Haskell OpenGL binding for GHC; profiling
v libghc- opengl- prof- 2.2.3.1- 2a93 -
v libghc- opengl- prof- 2.2.3.1- d355 -
p libghc6- opengl- dev - transitional dummy package
p libghc6- opengl- doc - transitional dummy package
p libghc6- opengl- prof - transitional dummy package
p libguichan- opengl- 0.8.1- 1 - small, efficient C++ GUI library ( OpenGL i
p libguichan- opengl- 0.8.1- 1 : i386 - small, efficient C++ GUI library ( OpenGL i
v libhugs- opengl -
v libhugs- opengl: i386 -
p libhugs- opengl- bundled - A binding for the OpenGL graphics system
p libhugs- opengl- bundled: i386 - A binding for the OpenGL graphics system
p libmrpt- opengl0.9 - Mobile Robot Programming Toolkit - opengl
p libmrpt- opengl0.9: i386 - Mobile Robot Programming Toolkit - opengl
p libopengl- perl - Perl interface providing graphics display
p libopengl- perl: i386 - Perl interface providing graphics display
p libopengl- ruby - OpenGL binding for Ruby
p libopengl- ruby1.8 - OpenGL binding for Ruby 1.8
p libopengl- ruby1.8: i386 - OpenGL binding for Ruby 1.8
p libopengl- ruby1.9.1 - OpenGL binding for Ruby 1.9.1
p libopengl- ruby1.9.1: i386 - OpenGL binding for Ruby 1.9.1
p libopengl- xscreensaver- perl - Perl module for writing OpenGL- based XScre
p libopengl- xscreensaver- perl: i38 - Perl module for writing OpenGL- based XScre
p libqt4- opengl - Qt 4 OpenGL module
p libqt4- opengl: i386 - Qt 4 OpenGL module
p libqt4- opengl- dev - Qt 4 OpenGL library development files
p libqt4- opengl- dev: i386 - Qt 4 OpenGL library development files
p libqtopengl4- perl - perl bindings for the Qt OpenGL library
p libqtopengl4- perl: i386 - perl bindings for the Qt OpenGL library
p libqtscript4- opengl - Qt Script bindings for the Qt 4 OpenGL lib
p libqtscript4- opengl: i386 - Qt Script bindings for the Qt 4 OpenGL lib
p libsmokeqtopengl4- 3 - Qt OpenGL SMOKE library
p libsmokeqtopengl4- 3 : i386 - Qt OpenGL SMOKE library
p libtaoframework- opengl- cil- dev - Tao CLI binding for OpenGL and GLU - devel
p libtaoframework- opengl3.0- cil - Tao CLI binding for OpenGL and GLU
p libtiff- opengl - TIFF manipulation and conversion tools
p libtiff- opengl: i386 - TIFF manipulation and conversion tools
p mgltools- opengltk - Opengltk Python extension
p mgltools- opengltk: i386 - Opengltk Python extension
p python- opengl - Python bindings to OpenGL
p python- pyside.qtopengl - Qt 4 OpenGL module - Python bindings
p python- pyside.qtopengl : i386 - Qt 4 OpenGL module - Python bindings
v python2.7- pyside.qtopengl -
v python2.7- pyside.qtopengl : i386 -
p python3- pyside.qtopengl - Qt 4 OpenGL module - Python3 bindings
p python3- pyside.qtopengl : i386 - Qt 4 OpenGL module - Python3 bindings
/*
* arch.c
*
* Created on: Feb 21, 2014
* Author: kamath
*/
#include<stdio.h>
#include<GL/glut.h>
#include<string.h>
int maxy= 600 , count= 0 , maxx= 500 , n= 3 , m= 3 ,r,q;
int count1= 0 ,count2= 0 ,count3= 0 ,count4= 0 ,count5= 0 ,count6= 0 ,count7= 0 ,count8= 0 ,count9= 0 ,count10= 0 ;
int x= 25 ,y= 50 ;
char str[ 10 ] ;
void id1( ) ;
void id( ) ;
void draw_target( ) ;
void redraw( ) ;
/*to display bitmap char*/
void bitmap_output( int x,int y,char * string,void * font)
{
int len,i;
glRasterPos2f( x,y) ;
len= ( int ) strlen ( string) ;
for ( i= 0 ; i< len; i++ )
{
glutBitmapCharacter( font,string[ i] ) ;
}
return ;
}
/*based on count display no of arrows and result of game*/
void counting( )
{
sprintf ( str,"No of arrows:%d" ,count) ;
bitmap_output( 400 ,40 ,str,GLUT_BITMAP_HELVETICA_18) ;
if ( count1== 1 && count2== 1 && count3== 1 && count4== 1 && count5== 1 && count6== 1 && count7== 1 && count8== 1 && count9== 1 && count10== 1 )
{
bitmap_output( 5 ,300 ,"CONGRATULATIONS YOU WON" ,GLUT_BITMAP_TIMES_ROMAN_24) ;
glutIdleFunc( NULL ) ;
}
else if ( count>= 15 )
{
sprintf ( str,"NO of arrows:%d,NO OF ARROWS OVER GAME LOST" ,count) ;
bitmap_output( 5 ,300 ,str,GLUT_BITMAP_TIMES_ROMAN_24) ;
glutIdleFunc( NULL ) ;
}
}
//TO CHECK WHETHER ARROW HITS TARGET
void disa( )
{
if ( ( x+ 110 == 300 ) && ( y>= 435 && y<= 465 ) && ( ! count1) )
{
count1= 1 ;
x= 25 ;
y= 0 ;
count++ ;
glutIdleFunc( id) ;
}
else if ( ( x+ 110 == 375 ) && ( y>= 385 && y<= 415 ) && ( ! count2) )
{
count2= 1 ;
x= 25 ;
y= 0 ;
count++ ;
glutIdleFunc( id) ;
}
else if ( ( x+ 110 == 399 ) && ( y>= 465 && y<= 495 ) && ( ! count3) )
{
count3= 1 ;
x= 25 ;
y= 0 ;
count++ ;
glutIdleFunc( id) ;
}
else if ( ( x+ 110 == 249 ) && ( y>= 355 && y<= 385 ) && ( ! count4) )
{
count4= 1 ;
x= 25 ;
y= 0 ;
count++ ;
glutIdleFunc( id) ;
}
else if ( ( x+ 110 == 351 ) && ( y>= 315 && y<= 345 ) && ( ! count5) )
{
count5= 1 ;
x= 25 ;
y= 0 ;
count++ ;
glutIdleFunc( id) ;
}
else if ( ( x+ 110 == 450 ) && ( y>= 275 && y<= 305 ) && ( ! count6) )
{
count6= 1 ;
x= 25 ;
y= 0 ;
count++ ;
glutIdleFunc( id) ;
}
else if ( ( x+ 110 == 330 ) && ( y>= 230 && y<= 260 ) && ( ! count7) )
{
count7= 1 ;
x= 25 ;
y= 0 ;
count++ ;
glutIdleFunc( id) ;
}
else if ( ( x+ 110 == 201 ) && ( y>= 185 && y<= 215 ) && ( ! count8) )
{
count8= 1 ;
x= 25 ;
y= 0 ;
count++ ;
glutIdleFunc( id) ;
}
else if ( ( x+ 110 == 339 ) && ( y>= 135 && y<= 165 ) && ( ! count9) )
{
count9= 1 ;
x= 25 ;
y= 0 ;
count++ ;
glutIdleFunc( id) ;
}
else if ( ( x+ 110 == 300 ) && ( y>= 85 && y<= 115 ) && ( ! count10) )
{
count10= 1 ;
x= 25 ;
y= 0 ;
count++ ;
glutIdleFunc( id) ;
}
}
/*to move arrow up*/
void id( )
{
y+ = n;
disa( ) ;
if ( y> maxy)
{
y= 0 ;
count++ ;
}
glutPostRedisplay( ) ;
}
//to draw arrow
void disp( )
{
glClear( GL_COLOR_BUFFER_BIT| GL_DEPTH_BUFFER_BIT) ;
glLoadIdentity( ) ;
glColor3f( 1 ,1 ,0 ) ;
bitmap_output( 150 ,450 ,"BLOCKSHOOTING" ,GLUT_BITMAP_TIMES_ROMAN_24) ;
counting( ) ;
//Drawing of arrow
glColor3f( 0 ,1 ,1 ) ;
glBegin( GL_LINES) ;
glVertex2d( x,y) ;
glVertex2d( x+ 100 ,y) ;
glEnd( ) ;
glLineWidth( 2 ) ;
glBegin( GL_LINES) ;
glVertex2d( x,y+ 2 ) ;
glVertex2d( x+ 100 ,y- 2 ) ;
glEnd( ) ;
glBegin( GL_LINES) ;
glVertex2d( x,y- 2 ) ;
glVertex2d( x+ 100 ,y- 2 ) ;
glEnd( ) ;
glBegin( GL_TRIANGLES) ;
glVertex2d ( x+ 100 ,y+ 3 ) ;
glVertex2d( x+ 110 ,y) ;
glVertex2d( x+ 100 ,y- 3 ) ;
glEnd( ) ;
glBegin( GL_QUADS) ;
glVertex2d( x,y+ 3 ) ;
glVertex2d( x,y- 3 ) ;
glVertex2d( x- 10 ,y- 5 ) ;
glVertex2d( x- 10 ,y+ 5 ) ;
glEnd( ) ;
draw_target( ) ;
glFlush( ) ;
glutSwapBuffers( ) ;
}
void init( )
{
glClearColor( 0 ,0 ,0 ,1 ) ;
glColor3f( 1 ,0 ,0 ) ;
glMatrixMode( GL_PROJECTION) ;
glLoadIdentity( ) ;
gluOrtho2D( 0 ,500 ,0 ,500 ) ;
glMatrixMode( GL_MODELVIEW) ;
}
//to draw the target inside the loop
void draw_target( )
{
if ( count1== 0 )
{
glColor3f( 1 ,0 ,1 ) ;
glPointSize( 30 ) ;
glBegin( GL_POINTS) ;
glVertex2d( 300 ,450 ) ;
glEnd( ) ;
glBegin( GL_LINE_LOOP) ;
glVertex2d( 285 ,465 ) ;
glVertex2d( 315 ,465 ) ;
glVertex2d( 315 ,435 ) ;
glVertex2d( 285 ,435 ) ;
glEnd( ) ;
}
else
{
glColor3f( 1 ,1 ,1 ) ;
glPointSize( 20 ) ;
glBegin( GL_POINTS) ;
glVertex2d( 300 ,450 ) ;
glEnd( ) ;
}
if ( count2== 0 )
{
glColor3f( 1 ,0 ,1 ) ;
glPointSize( 30 ) ;
glBegin( GL_POINTS) ;
glVertex2d( 375 ,400 ) ;
glEnd( ) ;
glBegin( GL_LINE_LOOP) ;
glVertex2d( 360 ,415 ) ;
glVertex2d( 390 ,415 ) ;
glVertex2d( 390 ,385 ) ;
glVertex2d( 360 ,385 ) ;
glEnd( ) ;
}
else
{
glColor3f( 1 ,1 ,1 ) ;
glPointSize( 20 ) ;
glBegin( GL_POINTS) ;
glVertex2d( 375 ,400 ) ;
glEnd( ) ;
}
if ( count3== 0 )
{
glColor3f( 1 ,0 ,1 ) ;
glPointSize( 30 ) ;
glBegin( GL_POINTS) ;
glVertex2d( 400 ,480 ) ;
glEnd( ) ;
glBegin( GL_LINE_LOOP) ;
glVertex2d( 385 ,495 ) ;
glVertex2d( 415 ,495 ) ;
glVertex2d( 415 ,465 ) ;
glVertex2d( 385 ,465 ) ;
glEnd( ) ;
}
else
{
glColor3f( 1 ,1 ,1 ) ;
glPointSize( 20 ) ;
glBegin( GL_POINTS) ;
glVertex2d( 400 ,480 ) ;
glEnd( ) ;
}
if ( count4== 0 )
{
glColor3f( 1 ,0 ,1 ) ;
glPointSize( 30 ) ;
glBegin( GL_POINTS) ;
glVertex2d( 250 ,370 ) ;
glEnd( ) ;
glBegin( GL_LINE_LOOP) ;
glVertex2d( 235 ,385 ) ;
glVertex2d( 265 ,385 ) ;
glVertex2d( 265 ,355 ) ;
glVertex2d( 235 ,355 ) ;
glEnd( ) ;
}
else
{
glColor3f( 1 ,1 ,1 ) ;
glPointSize( 20 ) ;
glBegin( GL_POINTS) ;
glVertex2d( 250 ,370 ) ;
glEnd( ) ;
}
if ( count5== 0 )
{
glColor3f( 1 ,0 ,1 ) ;
glPointSize( 30 ) ;
glBegin( GL_POINTS) ;
glVertex2d( 350 ,330 ) ;
glEnd( ) ;
glBegin( GL_LINE_LOOP) ;
glVertex2d( 335 ,345 ) ;
glVertex2d( 365 ,345 ) ;
glVertex2d( 365 ,315 ) ;
glVertex2d( 335 ,315 ) ;
glEnd( ) ;
}
else
{
glColor3f( 1 ,1 ,1 ) ;
glPointSize( 20 ) ;
glBegin( GL_POINTS) ;
glVertex2d( 350 ,330 ) ;
glEnd( ) ;
}
if ( count6== 0 )
{
glColor3f( 1 ,0 ,1 ) ;
glPointSize( 30 ) ;
glBegin( GL_POINTS) ;
glVertex2d( 450 ,290 ) ;
glEnd( ) ;
glBegin( GL_LINE_LOOP) ;
glVertex2d( 435 ,305 ) ;
glVertex2d( 465 ,305 ) ;
glVertex2d( 465 ,275 ) ;
glVertex2d( 435 ,275 ) ;
glEnd( ) ;
}
else
{
glColor3f( 1 ,1 ,1 ) ;
glPointSize( 20 ) ;
glBegin( GL_POINTS) ;
glVertex2d( 450 ,290 ) ;
glEnd( ) ;
}
if ( count7== 0 )
{
glColor3f( 1 ,0 ,1 ) ;
glPointSize( 30 ) ;
glBegin( GL_POINTS) ;
glVertex2d( 330 ,245 ) ;
glEnd( ) ;
glBegin( GL_LINE_LOOP) ;
glVertex2d( 315 ,260 ) ;
glVertex2d( 345 ,260 ) ;
glVertex2d( 345 ,230 ) ;
glVertex2d( 315 ,230 ) ;
glEnd( ) ;
}
else
{
glColor3f( 1 ,1 ,1 ) ;
glPointSize( 20 ) ;
glBegin( GL_POINTS) ;
glVertex2d( 330 ,245 ) ;
glEnd( ) ;
}
if ( count8== 0 )
{
glColor3f( 1 ,0 ,1 ) ;
glPointSize( 30 ) ;
glBegin( GL_POINTS) ;
glVertex2d( 200 ,200 ) ;
glEnd( ) ;
glBegin( GL_LINE_LOOP) ;
glVertex2d( 185 ,215 ) ;
glVertex2d( 215 ,215 ) ;
glVertex2d( 215 ,185 ) ;
glVertex2d( 185 ,185 ) ;
glEnd( ) ;
}
else
{
glColor3f( 1 ,1 ,1 ) ;
glPointSize( 20 ) ;
glBegin( GL_POINTS) ;
glVertex2d( 200 ,200 ) ;
glEnd( ) ;
}
if ( count9== 0 )
{
glColor3f( 1 ,0 ,1 ) ;
glPointSize( 30 ) ;
glBegin( GL_POINTS) ;
glVertex2d( 400 ,150 ) ;
glEnd( ) ;
glBegin( GL_LINE_LOOP) ;
glVertex2d( 385 ,165 ) ;
glVertex2d( 415 ,165 ) ;
glVertex2d( 415 ,135 ) ;
glVertex2d( 385 ,135 ) ;
glEnd( ) ;
}
else
{
glColor3f( 1 ,1 ,1 ) ;
glPointSize( 20 ) ;
glBegin( GL_POINTS) ;
glVertex2d( 400 ,150 ) ;
glEnd( ) ;
}
if ( count10== 0 )
{
glColor3f( 1 ,0 ,1 ) ;
glPointSize( 30 ) ;
glBegin( GL_POINTS) ;
glVertex2d( 300 ,100 ) ;
glEnd( ) ;
glBegin( GL_LINE_LOOP) ;
glVertex2d( 285 ,115 ) ;
glVertex2d( 315 ,115 ) ;
glVertex2d( 315 ,85 ) ;
glVertex2d( 285 ,85 ) ;
glEnd( ) ;
}
else
{
glColor3f( 1 ,1 ,1 ) ;
glPointSize( 20 ) ;
glBegin( GL_POINTS) ;
glVertex2d( 300 ,100 ) ;
glEnd( ) ;
}
glFlush( ) ;
}
//to move the arrow left when ‘r’ pressed
void id1( )
{
x+ = m;
disa( ) ;
if ( x+ 110 > maxx)
{
x= 25 ;
y= 0 ;
count++ ;
glutIdleFunc( id) ;
}
glutPostRedisplay( ) ;
}
//set key to perform desired operation
void keys( unsigned char k,int r,int q)
{
if ( k== 'r' )
glutIdleFunc( id1) ;
if ( k== 'q' )
exit ( 0 ) ;
}
//sub menu to display instructions
void demo_menu( int i)
{
switch ( i)
{
case 5 :
case 6 :
case 7 :
case 8 : break ;
}
}
//sub menu to display designer names
void demo( int i)
{
switch ( i)
{
case 9 :
case 10 :
case 11 : break ;
}
}
void game( int id)
{
switch ( id) ;
{
}
}
int main( int argc,char ** argv)
{
int sub_menu;
glutInit( & argc,argv) ;
glutInitDisplayMode( GLUT_DOUBLE| GLUT_RGB| GLUT_DEPTH) ;
glutInitWindowSize( 900 ,900 ) ;
glutCreateWindow( "BLOCK SHOOTING GAME ARCHERY" ) ;
sub_menu= glutCreateMenu( demo_menu) ;
glutAddMenuEntry( " r to move right" ,5 ) ;
glutAddMenuEntry( "A total of i5 arrows and 10 blocks are present" ,6 ) ;
glutAddMenuEntry( "You loose the game if the arrow count exceeds the blocks count" ,7 ) ;
glutAddMenuEntry( "or else you win" ,8 ) ;
glutCreateMenu( game) ;
glutAddSubMenu( "INSTRUCTIONS" ,sub_menu) ;
glutAttachMenu( GLUT_RIGHT_BUTTON) ;
glutDisplayFunc( disp) ;
glutIdleFunc( id) ;
glutKeyboardFunc( keys) ;
init( ) ;
glEnable( GL_DEPTH_TEST) ;
glutMainLoop( ) ;
return 0 ;
}
Z3JheUBlbGVtZW50YWw6fiQgYXB0aXR1ZGUgc2VhcmNoIG9wZW5nbApwICAgZ2FtYmFzMi1nYi1vcGVuZ2wgICAgICAgICAgICAgICAtIFRoZSBPcGVuR0wgY29tcG9uZW50IGZvciBHYW1iYXMgICAgICAgICAgIApwICAgZ2FtYmFzMi1nYi1vcGVuZ2w6aTM4NiAgICAgICAgICAtIFRoZSBPcGVuR0wgY29tcG9uZW50IGZvciBHYW1iYXMgICAgICAgICAgIApwICAgZ2FtYmFzMi1nYi1xdC1vcGVuZ2wgICAgICAgICAgICAtIE9wZW5HTCB3aXRoIFFUIHRvb2xraXQgR2FtYmFzIGNvbXBvbmVudCAgIApwICAgZ2FtYmFzMi1nYi1xdC1vcGVuZ2w6aTM4NiAgICAgICAtIE9wZW5HTCB3aXRoIFFUIHRvb2xraXQgR2FtYmFzIGNvbXBvbmVudCAgIApwICAgZ25hc2gtY29tbW9uLW9wZW5nbCAgICAgICAgICAgICAtIGR1bW15IHBhY2thZ2UgZm9yIGduYXNoLWNvbW1vbi1vcGVuZ2wgcmVtbwpwICAgZ25hc2gtb3BlbmdsICAgICAgICAgICAgICAgICAgICAtIGR1bW15IHBhY2thZ2UgZm9yIGduYXNoLW9wZW5nbCByZW1vdmFsICAgIApwICAga2xhc2gtb3BlbmdsICAgICAgICAgICAgICAgICAgICAtIGR1bW15IHBhY2thZ2UgZm9yIGtsYXNoLW9wZW5nbCByZW1vdmFsICAgIApwICAgbGliZ2hjLW9wZW5nbC1kZXYgICAgICAgICAgICAgICAtIEhhc2tlbGwgT3BlbkdMIGJpbmRpbmcgZm9yIEdIQyAgICAgICAgICAgIApwICAgbGliZ2hjLW9wZW5nbC1kZXY6aTM4NiAgICAgICAgICAtIEhhc2tlbGwgT3BlbkdMIGJpbmRpbmcgZm9yIEdIQyAgICAgICAgICAgIAp2ICAgbGliZ2hjLW9wZW5nbC1kZXYtMi4yLjMuMS0yYTkzNiAtICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAp2ICAgbGliZ2hjLW9wZW5nbC1kZXYtMi4yLjMuMS1kMzU1YyAtICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIApwICAgbGliZ2hjLW9wZW5nbC1kb2MgICAgICAgICAgICAgICAtIEhhc2tlbGwgT3BlbkdMIGJpbmRpbmcgZm9yIEdIQzsgZG9jdW1lbnRhdApwICAgbGliZ2hjLW9wZW5nbC1wcm9mICAgICAgICAgICAgICAtIEhhc2tlbGwgT3BlbkdMIGJpbmRpbmcgZm9yIEdIQzsgcHJvZmlsaW5nIApwICAgbGliZ2hjLW9wZW5nbC1wcm9mOmkzODYgICAgICAgICAtIEhhc2tlbGwgT3BlbkdMIGJpbmRpbmcgZm9yIEdIQzsgcHJvZmlsaW5nIAp2ICAgbGliZ2hjLW9wZW5nbC1wcm9mLTIuMi4zLjEtMmE5MyAtICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAp2ICAgbGliZ2hjLW9wZW5nbC1wcm9mLTIuMi4zLjEtZDM1NSAtICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIApwICAgbGliZ2hjNi1vcGVuZ2wtZGV2ICAgICAgICAgICAgICAtIHRyYW5zaXRpb25hbCBkdW1teSBwYWNrYWdlICAgICAgICAgICAgICAgIApwICAgbGliZ2hjNi1vcGVuZ2wtZG9jICAgICAgICAgICAgICAtIHRyYW5zaXRpb25hbCBkdW1teSBwYWNrYWdlICAgICAgICAgICAgICAgIApwICAgbGliZ2hjNi1vcGVuZ2wtcHJvZiAgICAgICAgICAgICAtIHRyYW5zaXRpb25hbCBkdW1teSBwYWNrYWdlICAgICAgICAgICAgICAgIApwICAgbGliZ3VpY2hhbi1vcGVuZ2wtMC44LjEtMSAgICAgICAtIHNtYWxsLCBlZmZpY2llbnQgQysrIEdVSSBsaWJyYXJ5IChPcGVuR0wgaQpwICAgbGliZ3VpY2hhbi1vcGVuZ2wtMC44LjEtMTppMzg2ICAtIHNtYWxsLCBlZmZpY2llbnQgQysrIEdVSSBsaWJyYXJ5IChPcGVuR0wgaQp2ICAgbGliaHVncy1vcGVuZ2wgICAgICAgICAgICAgICAgICAtICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAp2ICAgbGliaHVncy1vcGVuZ2w6aTM4NiAgICAgICAgICAgICAtICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIApwICAgbGliaHVncy1vcGVuZ2wtYnVuZGxlZCAgICAgICAgICAtIEEgYmluZGluZyBmb3IgdGhlIE9wZW5HTCBncmFwaGljcyBzeXN0ZW0gIApwICAgbGliaHVncy1vcGVuZ2wtYnVuZGxlZDppMzg2ICAgICAtIEEgYmluZGluZyBmb3IgdGhlIE9wZW5HTCBncmFwaGljcyBzeXN0ZW0gIApwICAgbGlibXJwdC1vcGVuZ2wwLjkgICAgICAgICAgICAgICAtIE1vYmlsZSBSb2JvdCBQcm9ncmFtbWluZyBUb29sa2l0IC0gb3BlbmdsIApwICAgbGlibXJwdC1vcGVuZ2wwLjk6aTM4NiAgICAgICAgICAtIE1vYmlsZSBSb2JvdCBQcm9ncmFtbWluZyBUb29sa2l0IC0gb3BlbmdsIApwICAgbGlib3BlbmdsLXBlcmwgICAgICAgICAgICAgICAgICAtIFBlcmwgaW50ZXJmYWNlIHByb3ZpZGluZyBncmFwaGljcyBkaXNwbGF5IApwICAgbGlib3BlbmdsLXBlcmw6aTM4NiAgICAgICAgICAgICAtIFBlcmwgaW50ZXJmYWNlIHByb3ZpZGluZyBncmFwaGljcyBkaXNwbGF5IApwICAgbGlib3BlbmdsLXJ1YnkgICAgICAgICAgICAgICAgICAtIE9wZW5HTCBiaW5kaW5nIGZvciBSdWJ5ICAgICAgICAgICAgICAgICAgIApwICAgbGlib3BlbmdsLXJ1YnkxLjggICAgICAgICAgICAgICAtIE9wZW5HTCBiaW5kaW5nIGZvciBSdWJ5IDEuOCAgICAgICAgICAgICAgIApwICAgbGlib3BlbmdsLXJ1YnkxLjg6aTM4NiAgICAgICAgICAtIE9wZW5HTCBiaW5kaW5nIGZvciBSdWJ5IDEuOCAgICAgICAgICAgICAgIApwICAgbGlib3BlbmdsLXJ1YnkxLjkuMSAgICAgICAgICAgICAtIE9wZW5HTCBiaW5kaW5nIGZvciBSdWJ5IDEuOS4xICAgICAgICAgICAgIApwICAgbGlib3BlbmdsLXJ1YnkxLjkuMTppMzg2ICAgICAgICAtIE9wZW5HTCBiaW5kaW5nIGZvciBSdWJ5IDEuOS4xICAgICAgICAgICAgIApwICAgbGlib3BlbmdsLXhzY3JlZW5zYXZlci1wZXJsICAgICAtIFBlcmwgbW9kdWxlIGZvciB3cml0aW5nIE9wZW5HTC1iYXNlZCBYU2NyZQpwICAgbGlib3BlbmdsLXhzY3JlZW5zYXZlci1wZXJsOmkzOCAtIFBlcmwgbW9kdWxlIGZvciB3cml0aW5nIE9wZW5HTC1iYXNlZCBYU2NyZQpwICAgbGlicXQ0LW9wZW5nbCAgICAgICAgICAgICAgICAgICAtIFF0IDQgT3BlbkdMIG1vZHVsZSAgICAgICAgICAgICAgICAgICAgICAgIApwICAgbGlicXQ0LW9wZW5nbDppMzg2ICAgICAgICAgICAgICAtIFF0IDQgT3BlbkdMIG1vZHVsZSAgICAgICAgICAgICAgICAgICAgICAgIApwICAgbGlicXQ0LW9wZW5nbC1kZXYgICAgICAgICAgICAgICAtIFF0IDQgT3BlbkdMIGxpYnJhcnkgZGV2ZWxvcG1lbnQgZmlsZXMgICAgIApwICAgbGlicXQ0LW9wZW5nbC1kZXY6aTM4NiAgICAgICAgICAtIFF0IDQgT3BlbkdMIGxpYnJhcnkgZGV2ZWxvcG1lbnQgZmlsZXMgICAgIApwICAgbGlicXRvcGVuZ2w0LXBlcmwgICAgICAgICAgICAgICAtIHBlcmwgYmluZGluZ3MgZm9yIHRoZSBRdCBPcGVuR0wgbGlicmFyeSAgIApwICAgbGlicXRvcGVuZ2w0LXBlcmw6aTM4NiAgICAgICAgICAtIHBlcmwgYmluZGluZ3MgZm9yIHRoZSBRdCBPcGVuR0wgbGlicmFyeSAgIApwICAgbGlicXRzY3JpcHQ0LW9wZW5nbCAgICAgICAgICAgICAtIFF0IFNjcmlwdCBiaW5kaW5ncyBmb3IgdGhlIFF0IDQgT3BlbkdMIGxpYgpwICAgbGlicXRzY3JpcHQ0LW9wZW5nbDppMzg2ICAgICAgICAtIFF0IFNjcmlwdCBiaW5kaW5ncyBmb3IgdGhlIFF0IDQgT3BlbkdMIGxpYgpwICAgbGlic21va2VxdG9wZW5nbDQtMyAgICAgICAgICAgICAtIFF0IE9wZW5HTCBTTU9LRSBsaWJyYXJ5ICAgICAgICAgICAgICAgICAgIApwICAgbGlic21va2VxdG9wZW5nbDQtMzppMzg2ICAgICAgICAtIFF0IE9wZW5HTCBTTU9LRSBsaWJyYXJ5ICAgICAgICAgICAgICAgICAgIApwICAgbGlidGFvZnJhbWV3b3JrLW9wZW5nbC1jaWwtZGV2ICAtIFRhbyBDTEkgYmluZGluZyBmb3IgT3BlbkdMIGFuZCBHTFUgLSBkZXZlbApwICAgbGlidGFvZnJhbWV3b3JrLW9wZW5nbDMuMC1jaWwgICAtIFRhbyBDTEkgYmluZGluZyBmb3IgT3BlbkdMIGFuZCBHTFUgICAgICAgIApwICAgbGlidGlmZi1vcGVuZ2wgICAgICAgICAgICAgICAgICAtIFRJRkYgbWFuaXB1bGF0aW9uIGFuZCBjb252ZXJzaW9uIHRvb2xzICAgIApwICAgbGlidGlmZi1vcGVuZ2w6aTM4NiAgICAgICAgICAgICAtIFRJRkYgbWFuaXB1bGF0aW9uIGFuZCBjb252ZXJzaW9uIHRvb2xzICAgIApwICAgbWdsdG9vbHMtb3BlbmdsdGsgICAgICAgICAgICAgICAtIE9wZW5nbHRrIFB5dGhvbiBleHRlbnNpb24gICAgICAgICAgICAgICAgIApwICAgbWdsdG9vbHMtb3BlbmdsdGs6aTM4NiAgICAgICAgICAtIE9wZW5nbHRrIFB5dGhvbiBleHRlbnNpb24gICAgICAgICAgICAgICAgIApwICAgcHl0aG9uLW9wZW5nbCAgICAgICAgICAgICAgICAgICAtIFB5dGhvbiBiaW5kaW5ncyB0byBPcGVuR0wgICAgICAgICAgICAgICAgIApwICAgcHl0aG9uLXB5c2lkZS5xdG9wZW5nbCAgICAgICAgICAtIFF0IDQgT3BlbkdMIG1vZHVsZSAtIFB5dGhvbiBiaW5kaW5ncyAgICAgIApwICAgcHl0aG9uLXB5c2lkZS5xdG9wZW5nbDppMzg2ICAgICAtIFF0IDQgT3BlbkdMIG1vZHVsZSAtIFB5dGhvbiBiaW5kaW5ncyAgICAgIAp2ICAgcHl0aG9uMi43LXB5c2lkZS5xdG9wZW5nbCAgICAgICAtICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAp2ICAgcHl0aG9uMi43LXB5c2lkZS5xdG9wZW5nbDppMzg2ICAtICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIApwICAgcHl0aG9uMy1weXNpZGUucXRvcGVuZ2wgICAgICAgICAtIFF0IDQgT3BlbkdMIG1vZHVsZSAtIFB5dGhvbjMgYmluZGluZ3MgICAgIApwICAgcHl0aG9uMy1weXNpZGUucXRvcGVuZ2w6aTM4NiAgICAtIFF0IDQgT3BlbkdMIG1vZHVsZSAtIFB5dGhvbjMgYmluZGluZ3MgCgoKLyoKICogYXJjaC5jCiAqCiAqICBDcmVhdGVkIG9uOiBGZWIgMjEsIDIwMTQKICogICAgICBBdXRob3I6IGthbWF0aAogKi8KI2luY2x1ZGU8c3RkaW8uaD4KI2luY2x1ZGU8R0wvZ2x1dC5oPgojaW5jbHVkZTxzdHJpbmcuaD4KaW50IG1heHk9NjAwLCBjb3VudD0wLCBtYXh4PTUwMCwgbj0zLCBtPTMscixxOwppbnQgY291bnQxPTAsY291bnQyPTAsY291bnQzPTAsY291bnQ0PTAsY291bnQ1PTAsY291bnQ2PTAsY291bnQ3PTAsY291bnQ4PTAsY291bnQ5PTAsY291bnQxMD0wOwppbnQgeD0yNSx5PTUwOwpjaGFyIHN0clsxMF07CnZvaWQgaWQxKCk7CnZvaWQgaWQoKTsKdm9pZCBkcmF3X3RhcmdldCgpOwp2b2lkIHJlZHJhdygpOwoKLyp0byBkaXNwbGF5IGJpdG1hcCBjaGFyKi8Kdm9pZCBiaXRtYXBfb3V0cHV0KGludCB4LGludCB5LGNoYXIgKnN0cmluZyx2b2lkICpmb250KQp7CmludCBsZW4saTsKZ2xSYXN0ZXJQb3MyZih4LHkpOwpsZW49KGludClzdHJsZW4oc3RyaW5nKTsKZm9yKGk9MDtpPGxlbjtpKyspCnsKZ2x1dEJpdG1hcENoYXJhY3Rlcihmb250LHN0cmluZ1tpXSk7Cn0KcmV0dXJuOwp9CgovKmJhc2VkIG9uIGNvdW50IGRpc3BsYXkgbm8gb2YgYXJyb3dzIGFuZCByZXN1bHQgb2YgZ2FtZSovCnZvaWQgY291bnRpbmcoKQp7CnNwcmludGYoc3RyLCJObyBvZiBhcnJvd3M6JWQiLGNvdW50KTsKYml0bWFwX291dHB1dCg0MDAsNDAsc3RyLEdMVVRfQklUTUFQX0hFTFZFVElDQV8xOCk7CmlmKGNvdW50MT09MSAmJiBjb3VudDI9PTEgJiYgY291bnQzPT0xICYmIGNvdW50ND09MSAmJiBjb3VudDU9PTEgJiYgY291bnQ2PT0xICYmIGNvdW50Nz09MSAmJiBjb3VudDg9PTEgJiYgY291bnQ5PT0xICYmIGNvdW50MTA9PTEpCnsKYml0bWFwX291dHB1dCg1LDMwMCwiQ09OR1JBVFVMQVRJT05TIFlPVSBXT04iLEdMVVRfQklUTUFQX1RJTUVTX1JPTUFOXzI0KTsKZ2x1dElkbGVGdW5jKE5VTEwpOwp9CmVsc2UgaWYoY291bnQ+PTE1KQp7CnNwcmludGYoc3RyLCJOTyBvZiBhcnJvd3M6JWQsTk8gT0YgQVJST1dTIE9WRVIgR0FNRSBMT1NUIixjb3VudCk7CmJpdG1hcF9vdXRwdXQoNSwzMDAsc3RyLEdMVVRfQklUTUFQX1RJTUVTX1JPTUFOXzI0KTsKZ2x1dElkbGVGdW5jKE5VTEwpOwp9Cn0KCi8vVE8gQ0hFQ0sgV0hFVEhFUiBBUlJPVyBISVRTIFRBUkdFVAp2b2lkIGRpc2EoKQp7CmlmKCh4KzExMD09MzAwKSAmJiAoeT49NDM1ICYmIHk8PTQ2NSkgJiYgKCFjb3VudDEpKQp7CmNvdW50MT0xOwp4PTI1Owp5PTA7CmNvdW50Kys7CmdsdXRJZGxlRnVuYyhpZCk7Cn0KZWxzZSBpZigoeCsxMTAgPT0gMzc1KSYmKHk+PTM4NSYmeTw9NDE1KSAmJiAoIWNvdW50MikpCnsKY291bnQyPTE7Cng9MjU7Cnk9MDsKY291bnQrKzsKZ2x1dElkbGVGdW5jKGlkKTsKfQplbHNlIGlmKCh4KzExMD09Mzk5KSYmKHk+PTQ2NSAmJnk8PTQ5NSkmJighY291bnQzKSkKewpjb3VudDM9MTsKeD0yNTsKeT0wOwpjb3VudCsrOwpnbHV0SWRsZUZ1bmMoaWQpOwp9CmVsc2UgaWYoKHgrMTEwPT0yNDkpJiYoeT49MzU1JiZ5PD0zODUpJiYoIWNvdW50NCkpCgp7CmNvdW50ND0xOwp4PTI1Owp5PTA7CmNvdW50Kys7CmdsdXRJZGxlRnVuYyhpZCk7Cn0KZWxzZSBpZigoeCsxMTA9PTM1MSkmJih5Pj0zMTUmJnk8PTM0NSkmJighY291bnQ1KSkKewpjb3VudDU9MTsKeD0yNTsKeT0wOwpjb3VudCsrOwpnbHV0SWRsZUZ1bmMoaWQpOwp9CmVsc2UgaWYoKHgrMTEwPT00NTApJiYoeT49Mjc1JiZ5PD0zMDUpJiYoIWNvdW50NikpCnsKY291bnQ2PTE7Cng9MjU7Cnk9MDsKY291bnQrKzsKZ2x1dElkbGVGdW5jKGlkKTsKfQplbHNlIGlmKCh4KzExMD09MzMwKSYmKHk+PTIzMCYmeTw9MjYwKSYmKCFjb3VudDcpKQp7CmNvdW50Nz0xOwp4PTI1Owp5PTA7CmNvdW50Kys7CmdsdXRJZGxlRnVuYyhpZCk7Cn0KZWxzZSBpZigoeCsxMTA9PTIwMSkmJih5Pj0xODUmJnk8PTIxNSkmJighY291bnQ4KSkKewpjb3VudDg9MTsKeD0yNTsKeT0wOwpjb3VudCsrOwpnbHV0SWRsZUZ1bmMoaWQpOwp9CmVsc2UgaWYoKHgrMTEwPT0zMzkpJiYoeT49MTM1JiZ5PD0xNjUpJiYoIWNvdW50OSkpCnsKY291bnQ5PTE7Cng9MjU7Cnk9MDsKY291bnQrKzsKZ2x1dElkbGVGdW5jKGlkKTsKfQplbHNlIGlmKCh4KzExMD09MzAwKSYmKHk+PTg1JiZ5PD0xMTUpJiYoIWNvdW50MTApKQp7CmNvdW50MTA9MTsKeD0yNTsKeT0wOwpjb3VudCsrOwpnbHV0SWRsZUZ1bmMoaWQpOwp9Cn0KCi8qdG8gbW92ZSBhcnJvdyB1cCovCnZvaWQgaWQoKQp7CnkrPW47CmRpc2EoKTsKaWYoeT5tYXh5KQp7Cnk9MDsKY291bnQrKzsKfQpnbHV0UG9zdFJlZGlzcGxheSgpOwp9Ci8vdG8gZHJhdyBhcnJvdwp2b2lkIGRpc3AoKQp7CmdsQ2xlYXIoR0xfQ09MT1JfQlVGRkVSX0JJVHxHTF9ERVBUSF9CVUZGRVJfQklUKTsKZ2xMb2FkSWRlbnRpdHkoKTsKZ2xDb2xvcjNmKDEsMSwwKTsKYml0bWFwX291dHB1dCgxNTAsNDUwLCJCTE9DS1NIT09USU5HIixHTFVUX0JJVE1BUF9USU1FU19ST01BTl8yNCk7CmNvdW50aW5nKCk7Ci8vRHJhd2luZyAgb2YgYXJyb3cKZ2xDb2xvcjNmKDAsMSwxKTsKZ2xCZWdpbihHTF9MSU5FUyk7CmdsVmVydGV4MmQoeCx5KTsKZ2xWZXJ0ZXgyZCh4KzEwMCx5KTsKZ2xFbmQoKTsKZ2xMaW5lV2lkdGgoMik7CmdsQmVnaW4oR0xfTElORVMpOwpnbFZlcnRleDJkKHgseSsyKTsKZ2xWZXJ0ZXgyZCh4KzEwMCx5LTIpOwpnbEVuZCgpOwpnbEJlZ2luKEdMX0xJTkVTKTsKZ2xWZXJ0ZXgyZCh4LHktMik7CmdsVmVydGV4MmQoeCsxMDAseS0yKTsKZ2xFbmQoKTsKZ2xCZWdpbihHTF9UUklBTkdMRVMpOwpnbFZlcnRleDJkICh4KzEwMCx5KzMpOwpnbFZlcnRleDJkKHgrMTEwLHkpOwpnbFZlcnRleDJkKHgrMTAwLHktMyk7CmdsRW5kKCk7CmdsQmVnaW4oR0xfUVVBRFMpOwpnbFZlcnRleDJkKHgseSszKTsKZ2xWZXJ0ZXgyZCh4LHktMyk7CmdsVmVydGV4MmQoeC0xMCx5LTUpOwpnbFZlcnRleDJkKHgtMTAseSs1KTsKZ2xFbmQoKTsKZHJhd190YXJnZXQoKTsKZ2xGbHVzaCgpOwpnbHV0U3dhcEJ1ZmZlcnMoKTsKfQoKdm9pZCBpbml0KCkKewpnbENsZWFyQ29sb3IoMCwwLDAsMSk7CmdsQ29sb3IzZigxLDAsMCk7CmdsTWF0cml4TW9kZShHTF9QUk9KRUNUSU9OKTsKZ2xMb2FkSWRlbnRpdHkoKTsKZ2x1T3J0aG8yRCgwLDUwMCwwLDUwMCk7CmdsTWF0cml4TW9kZShHTF9NT0RFTFZJRVcpOwp9CgovL3RvIGRyYXcgdGhlIHRhcmdldCBpbnNpZGUgdGhlIGxvb3AKCnZvaWQgZHJhd190YXJnZXQoKQp7CmlmKGNvdW50MT09MCkKewpnbENvbG9yM2YoMSwwLDEpOwpnbFBvaW50U2l6ZSgzMCk7CmdsQmVnaW4oR0xfUE9JTlRTKTsKZ2xWZXJ0ZXgyZCgzMDAsNDUwKTsKZ2xFbmQoKTsKZ2xCZWdpbihHTF9MSU5FX0xPT1ApOwpnbFZlcnRleDJkKDI4NSw0NjUpOwpnbFZlcnRleDJkKDMxNSw0NjUpOwpnbFZlcnRleDJkKDMxNSw0MzUpOwpnbFZlcnRleDJkKDI4NSw0MzUpOwpnbEVuZCgpOwp9CmVsc2UKewpnbENvbG9yM2YoMSwxLDEpOwpnbFBvaW50U2l6ZSgyMCk7CmdsQmVnaW4oR0xfUE9JTlRTKTsKZ2xWZXJ0ZXgyZCgzMDAsNDUwKTsKZ2xFbmQoKTsKfQppZihjb3VudDI9PTApCnsKZ2xDb2xvcjNmKDEsMCwxKTsKZ2xQb2ludFNpemUoMzApOwpnbEJlZ2luKEdMX1BPSU5UUyk7CmdsVmVydGV4MmQoMzc1LDQwMCk7CmdsRW5kKCk7CmdsQmVnaW4oR0xfTElORV9MT09QKTsKZ2xWZXJ0ZXgyZCgzNjAsNDE1KTsKZ2xWZXJ0ZXgyZCgzOTAsNDE1KTsKZ2xWZXJ0ZXgyZCgzOTAsMzg1KTsKZ2xWZXJ0ZXgyZCgzNjAsMzg1KTsKZ2xFbmQoKTsKfQplbHNlCnsKCWdsQ29sb3IzZigxLDEsMSk7CmdsUG9pbnRTaXplKDIwKTsKZ2xCZWdpbihHTF9QT0lOVFMpOwpnbFZlcnRleDJkKDM3NSw0MDApOwpnbEVuZCgpOwp9CmlmKGNvdW50Mz09MCkKewpnbENvbG9yM2YoMSwwLDEpOwpnbFBvaW50U2l6ZSgzMCk7CmdsQmVnaW4oR0xfUE9JTlRTKTsKZ2xWZXJ0ZXgyZCg0MDAsNDgwKTsKZ2xFbmQoKTsKZ2xCZWdpbihHTF9MSU5FX0xPT1ApOwpnbFZlcnRleDJkKDM4NSw0OTUpOwpnbFZlcnRleDJkKDQxNSw0OTUpOwpnbFZlcnRleDJkKDQxNSw0NjUpOwpnbFZlcnRleDJkKDM4NSw0NjUpOwpnbEVuZCgpOwp9CmVsc2UKewpnbENvbG9yM2YoMSwxLDEpOwpnbFBvaW50U2l6ZSgyMCk7CmdsQmVnaW4oR0xfUE9JTlRTKTsKZ2xWZXJ0ZXgyZCg0MDAsNDgwKTsKZ2xFbmQoKTsKfQppZihjb3VudDQ9PTApCnsKZ2xDb2xvcjNmKDEsMCwxKTsKZ2xQb2ludFNpemUoMzApOwpnbEJlZ2luKEdMX1BPSU5UUyk7CmdsVmVydGV4MmQoMjUwLDM3MCk7CmdsRW5kKCk7CmdsQmVnaW4oR0xfTElORV9MT09QKTsKZ2xWZXJ0ZXgyZCgyMzUsMzg1KTsKZ2xWZXJ0ZXgyZCgyNjUsMzg1KTsKZ2xWZXJ0ZXgyZCgyNjUsMzU1KTsKZ2xWZXJ0ZXgyZCgyMzUsMzU1KTsKZ2xFbmQoKTsKfQplbHNlCnsKZ2xDb2xvcjNmKDEsMSwxKTsKZ2xQb2ludFNpemUoMjApOwpnbEJlZ2luKEdMX1BPSU5UUyk7CmdsVmVydGV4MmQoMjUwLDM3MCk7CmdsRW5kKCk7Cn0KaWYoY291bnQ1PT0wKQp7CmdsQ29sb3IzZigxLDAsMSk7CmdsUG9pbnRTaXplKDMwKTsKZ2xCZWdpbihHTF9QT0lOVFMpOwpnbFZlcnRleDJkKDM1MCwzMzApOwpnbEVuZCgpOwpnbEJlZ2luKEdMX0xJTkVfTE9PUCk7CmdsVmVydGV4MmQoMzM1LDM0NSk7CmdsVmVydGV4MmQoMzY1LDM0NSk7CmdsVmVydGV4MmQoMzY1LDMxNSk7CmdsVmVydGV4MmQoMzM1LDMxNSk7CmdsRW5kKCk7Cn0KZWxzZQp7CmdsQ29sb3IzZigxLDEsMSk7CmdsUG9pbnRTaXplKDIwKTsKZ2xCZWdpbihHTF9QT0lOVFMpOwpnbFZlcnRleDJkKDM1MCwzMzApOwpnbEVuZCgpOwp9CmlmKGNvdW50Nj09MCkKewpnbENvbG9yM2YoMSwwLDEpOwpnbFBvaW50U2l6ZSgzMCk7CmdsQmVnaW4oR0xfUE9JTlRTKTsKZ2xWZXJ0ZXgyZCg0NTAsMjkwKTsKZ2xFbmQoKTsKZ2xCZWdpbihHTF9MSU5FX0xPT1ApOwpnbFZlcnRleDJkKDQzNSwzMDUpOwpnbFZlcnRleDJkKDQ2NSwzMDUpOwpnbFZlcnRleDJkKDQ2NSwyNzUpOwpnbFZlcnRleDJkKDQzNSwyNzUpOwpnbEVuZCgpOwp9CmVsc2UKewpnbENvbG9yM2YoMSwxLDEpOwpnbFBvaW50U2l6ZSgyMCk7CmdsQmVnaW4oR0xfUE9JTlRTKTsKZ2xWZXJ0ZXgyZCg0NTAsMjkwKTsKZ2xFbmQoKTsKfQppZihjb3VudDc9PTApCnsKZ2xDb2xvcjNmKDEsMCwxKTsKZ2xQb2ludFNpemUoMzApOwpnbEJlZ2luKEdMX1BPSU5UUyk7CmdsVmVydGV4MmQoMzMwLDI0NSk7CmdsRW5kKCk7CmdsQmVnaW4oR0xfTElORV9MT09QKTsKZ2xWZXJ0ZXgyZCgzMTUsMjYwKTsKZ2xWZXJ0ZXgyZCgzNDUsMjYwKTsKZ2xWZXJ0ZXgyZCgzNDUsMjMwKTsKZ2xWZXJ0ZXgyZCgzMTUsMjMwKTsKZ2xFbmQoKTsKfQplbHNlCnsKZ2xDb2xvcjNmKDEsMSwxKTsKZ2xQb2ludFNpemUoMjApOwpnbEJlZ2luKEdMX1BPSU5UUyk7CmdsVmVydGV4MmQoMzMwLDI0NSk7CmdsRW5kKCk7Cn0KaWYoY291bnQ4PT0wKQp7CmdsQ29sb3IzZigxLDAsMSk7CmdsUG9pbnRTaXplKDMwKTsKZ2xCZWdpbihHTF9QT0lOVFMpOwpnbFZlcnRleDJkKDIwMCwyMDApOwpnbEVuZCgpOwpnbEJlZ2luKEdMX0xJTkVfTE9PUCk7CmdsVmVydGV4MmQoMTg1LDIxNSk7CmdsVmVydGV4MmQoMjE1LDIxNSk7CmdsVmVydGV4MmQoMjE1LDE4NSk7CmdsVmVydGV4MmQoMTg1LDE4NSk7CmdsRW5kKCk7Cn0KZWxzZQp7CmdsQ29sb3IzZigxLDEsMSk7CmdsUG9pbnRTaXplKDIwKTsKZ2xCZWdpbihHTF9QT0lOVFMpOwpnbFZlcnRleDJkKDIwMCwyMDApOwpnbEVuZCgpOwp9CmlmKGNvdW50OT09MCkKewpnbENvbG9yM2YoMSwwLDEpOwpnbFBvaW50U2l6ZSgzMCk7CmdsQmVnaW4oR0xfUE9JTlRTKTsKZ2xWZXJ0ZXgyZCg0MDAsMTUwKTsKZ2xFbmQoKTsKZ2xCZWdpbihHTF9MSU5FX0xPT1ApOwpnbFZlcnRleDJkKDM4NSwxNjUpOwpnbFZlcnRleDJkKDQxNSwxNjUpOwpnbFZlcnRleDJkKDQxNSwxMzUpOwpnbFZlcnRleDJkKDM4NSwxMzUpOwpnbEVuZCgpOwp9CmVsc2UKewpnbENvbG9yM2YoMSwxLDEpOwpnbFBvaW50U2l6ZSgyMCk7CmdsQmVnaW4oR0xfUE9JTlRTKTsKZ2xWZXJ0ZXgyZCg0MDAsMTUwKTsKZ2xFbmQoKTsKfQppZihjb3VudDEwPT0wKQp7CmdsQ29sb3IzZigxLDAsMSk7CmdsUG9pbnRTaXplKDMwKTsKZ2xCZWdpbihHTF9QT0lOVFMpOwpnbFZlcnRleDJkKDMwMCwxMDApOwpnbEVuZCgpOwpnbEJlZ2luKEdMX0xJTkVfTE9PUCk7CmdsVmVydGV4MmQoMjg1LDExNSk7CmdsVmVydGV4MmQoMzE1LDExNSk7CmdsVmVydGV4MmQoMzE1LDg1KTsKZ2xWZXJ0ZXgyZCgyODUsODUpOwpnbEVuZCgpOwp9CmVsc2UKewpnbENvbG9yM2YoMSwxLDEpOwpnbFBvaW50U2l6ZSgyMCk7CmdsQmVnaW4oR0xfUE9JTlRTKTsKZ2xWZXJ0ZXgyZCgzMDAsMTAwKTsKZ2xFbmQoKTsKfQpnbEZsdXNoKCk7Cn0KCi8vdG8gbW92ZSB0aGUgYXJyb3cgbGVmdCB3aGVuIOKAmHLigJkgcHJlc3NlZAp2b2lkIGlkMSgpCnsKeCs9bTsKZGlzYSgpOwppZih4KzExMD5tYXh4KQp7Cng9MjU7Cnk9MDsKY291bnQrKzsKZ2x1dElkbGVGdW5jKGlkKTsKfQpnbHV0UG9zdFJlZGlzcGxheSgpOwp9CgovL3NldCBrZXkgdG8gcGVyZm9ybSBkZXNpcmVkIG9wZXJhdGlvbgp2b2lkIGtleXModW5zaWduZWQgY2hhciBrLGludCByLGludCBxKQp7CmlmKGs9PSdyJykKZ2x1dElkbGVGdW5jKGlkMSk7CmlmKGs9PSdxJykKZXhpdCgwKTsKfQoKLy9zdWIgbWVudSB0byBkaXNwbGF5IGluc3RydWN0aW9ucwp2b2lkIGRlbW9fbWVudShpbnQgaSkKewpzd2l0Y2goaSkKewpjYXNlIDU6CmNhc2UgNjoKY2FzZSA3OgpjYXNlIDg6YnJlYWs7Cn0KfQoKLy9zdWIgbWVudSB0byBkaXNwbGF5IGRlc2lnbmVyIG5hbWVzCnZvaWQgZGVtbyhpbnQgaSkKewpzd2l0Y2goaSkKewpjYXNlIDk6CmNhc2UgMTA6CmNhc2UgMTE6YnJlYWs7Cn0KfQp2b2lkIGdhbWUoaW50IGlkKQp7CnN3aXRjaChpZCk7CnsKfQp9CmludCBtYWluKGludCBhcmdjLGNoYXIgKiphcmd2KQp7CmludCBzdWJfbWVudTsKZ2x1dEluaXQoJmFyZ2MsYXJndik7CmdsdXRJbml0RGlzcGxheU1vZGUoR0xVVF9ET1VCTEV8R0xVVF9SR0J8R0xVVF9ERVBUSCk7CmdsdXRJbml0V2luZG93U2l6ZSg5MDAsOTAwKTsKZ2x1dENyZWF0ZVdpbmRvdygiQkxPQ0sgU0hPT1RJTkcgR0FNRSBBUkNIRVJZIik7CnN1Yl9tZW51PWdsdXRDcmVhdGVNZW51KGRlbW9fbWVudSk7CmdsdXRBZGRNZW51RW50cnkoIiByICB0byBtb3ZlIHJpZ2h0Iiw1KTsKZ2x1dEFkZE1lbnVFbnRyeSgiQSB0b3RhbCBvZiBpNSBhcnJvd3MgYW5kIDEwIGJsb2NrcyBhcmUgcHJlc2VudCIsNik7CmdsdXRBZGRNZW51RW50cnkoIllvdSBsb29zZSB0aGUgZ2FtZSBpZiB0aGUgYXJyb3cgY291bnQgZXhjZWVkcyB0aGUgYmxvY2tzIGNvdW50Iiw3KTsKZ2x1dEFkZE1lbnVFbnRyeSgib3IgZWxzZSB5b3Ugd2luIiw4KTsKZ2x1dENyZWF0ZU1lbnUoZ2FtZSk7CmdsdXRBZGRTdWJNZW51KCJJTlNUUlVDVElPTlMiLHN1Yl9tZW51KTsKZ2x1dEF0dGFjaE1lbnUoR0xVVF9SSUdIVF9CVVRUT04pOwpnbHV0RGlzcGxheUZ1bmMoZGlzcCk7CmdsdXRJZGxlRnVuYyhpZCk7CmdsdXRLZXlib2FyZEZ1bmMoa2V5cyk7CmluaXQoKTsKZ2xFbmFibGUoR0xfREVQVEhfVEVTVCk7CmdsdXRNYWluTG9vcCgpOwpyZXR1cm4gMDsKfQoKCgoKCgoKCgoKCgoKCgoKCgoKCg==