From aschaffe  Thu Oct 14 13:44:36 1993
Resent-From: aschaffe (Allan Schaffer)
Resent-Message-Id: <9310141344.ZM6928@holodeck.asd.sgi.com>
Resent-Date: Thu, 14 Oct 1993 13:44:35 -0700
X-Mailer: Z-Mail (3.0B.0 25aug93 MediaMail)
Resent-To: info-performer-dist
From: Renee Strong <renee@pat.mdc.com>
Message-Id: <9310141953.AA26007@pat.mdc.com>
Subject: Mixing X and Performer
To: info-performer@sgi.sgi.com
Date: Thu, 14 Oct 93 14:53:24 CDT
X-Mailer: ELM [version 2.3 PL11]
Status: OR


What do I have to do to mix X and Performer.  I have documentation on
doing GL and X.  Is there documentation on Performer and X?

Thanks,
Renee Strong

renee@pat.mdc.com



From guest  Fri Jan  7 18:47:05 1994
Date: Fri, 7 Jan 94 18:48:23 -0800
From: covingto@elsie.cs.nps.navy.mil (james covington)
Message-Id: <9401080248.AA06640@elsie.cs.nps.navy.mil>
To: info-performer@sgi.sgi.com
Subject: Performer and OSF/Motif
Status: OR

I have reviewed Wade Olsen's sample program which shows how to run Performer
inside a Motif application. However when I tried to modify a larger existing
Performer application (one which used the standard winopen() call in the
pfInitfunc) to run in this manner, I received GL error #114 (ERR_NOGRAPHICS)
when I called the GLXlink function. Can you help explain what causes error
#114, and what I could possibly do to avoid it?
                  Thanks,
                      James Covington
                      Naval Postgraduate School
                      Monterey CA




From guest  Sat Jan  8 04:20:48 1994
Date: Sat, 8 Jan 94 04:20:38 -0800
From: ib@ivan (Ivan Bach)
Message-Id: <9401081220.AA12665@ivan.asd.sgi.com>
To: covingto@elsie.cs.nps.navy.mil (james covington),
        info-performer@sgi.sgi.com
Subject: Re:  Performer and OSF/Motif
Status: O

You should always specify which versions of software you are using when you
report a software problem.  I will assume that you are using some version of
IRIX 4.

Motif is just a toolkit that makes it easier to write X programs.  You seem
to be trying to mix GL and X.  If that is what you want to do, you need to
write a mixed-model program that calls routines such as:

    GLXgetconfig
    GLXwinset
    GLXlink
    GLXunlink

Please read the man pages for these routines.  In the man page for
GLXwinset(3G), it says:
-------------------------------------------------------------------------
     All of the GL routines which access window system controlled features 
     are illegal to call for a mixed model window.  Not all of these routines
     report errors, so here is a list of the routines which mixed model
     programs cannot call.

     qdevice, qread, qtest, qenter, getbutton, getvaluator, setvaluator,
     noise, unqdevice, mapcolor, getmcolor, gconfig, doubelbuffer,
     singlebuffer, RGBmode, cimode, overlay, underlay, acsize, curstype,
     defcursor, setcursor, winopen, wintitle, winposition, winmove,
     foreground, noborder, noport, iconsize, icontitle, keepaspect, maxsize,
     minsize, step, fudge, prefposition, prefsize

     The following routines will work, but execute much slower for mixed model
     windows, and this information should be obtained from the window system
     if at all possible.  Avoid these routines.

     getsize, getorigin, reshapeviewport, getviewport
-------------------------------------------------------------------------
If your program is a mixed-model program, it should not call winopen.

Please install 4Dgifts (sample programs from SGI), and look at the sample
programs in the directory:

    /usr/people/4Dgifts/examples/GLX

Basically, your program can open a window, and bind it to GL.  Once a window
is bound to GL, it becomes a mixed-model window, and you can use only GL
routines to draw in that window.  If you try to use X routines to draw in
that window, the results are undefined.

Mixed-model programming is also explained in the "Transition Guide: 
Programming Environment."

Please check whether you are linking your program with a shared (libgl_s, 
-lgl_s) or unshared (libgl, -lgl) version of the graphics library.  Only 
the shared version can do distributed or remote GL (dgl).  

Enter:

    printenv

or:

    echo $DISPLAY

to check the setting of your environment variable DISPLAY.  If DISPLAY
points to a remote machine (not set to :0), or if your machine is a gateway 
and has two entries in the host table (bug in dgl), you can get the error 
message you reported.

Ivan Bach, ib@asd.sgi.com






From guest  Sun Jan  9 18:49:18 1994
From: "Sharon Fischler" <srf@rose>
Message-Id: <9401091849.ZM3737@rose.asd.sgi.com>
Date: Sun, 9 Jan 1994 18:49:11 -0800
In-Reply-To: covingto@elsie.cs.nps.navy.mil (james covington)
        "Performer and OSF/Motif" (Jan  7,  6:48pm)
References: <9401080248.AA06640@elsie.cs.nps.navy.mil>
X-Mailer: Z-Mail-SGI (3.0S.1026 26oct93 MediaMail)
To: covingto@elsie.cs.nps.navy.mil (james covington),
        info-performer@sgi.sgi.com
Subject: Re: Performer and OSF/Motif
Cc: wade@rose
Content-Type: text/plain; charset=us-ascii
Mime-Version: 1.0
Status: O

+>---- On Jan 7,  6:48pm, james covington wrote:
> Subject: Performer and OSF/Motif
->I have reviewed Wade Olsen's sample program which shows how to run Performer
->inside a Motif application. However when I tried to modify a larger existing
->Performer application (one which used the standard winopen() call in the
->pfInitfunc) to run in this manner, I received GL error #114 (ERR_NOGRAPHICS)
->when I called the GLXlink function. Can you help explain what causes error
->#114, and what I could possibly do to avoid it?

Are you sure that you get this error from GLXlink or did it come from
code initializing the GL window?
Anyway, you do want to be sure to call pfInitGLXGfx() instead of
pfInitGfx() since you are doing a GLX window.

Wade can comment on hints for adapting his code.

However, Performer does support running a program under GLX.
There are a couple of sample programs that demonstrate this in
	/usr/src/Performer/src/pguide/libpf/progs

		complex-glx.c - a most minimal roll-your-own glx example

		utilui.c - uses utilities in libpfutil for setting up
			a GLX window and also for doing X input handling
			asynchronously in a separate process.

	You can also look at /usr/src/Performer/src/lib/libpfutil/xwin.c
		to see how we set up GLX windows and call GLXlink.\
		Look at the routine pfuGLXCreateWindow().


	for even more glx exapmles, you can look in
		/usr/people/4Dgifts/examples/GLX/{gl-Xlib,glxwidget}

srf.

-- 
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Sharon Rose Fischler - Silicon Graphics, Advanced Graphics Development
srf@sgi.com  (415) 390 - 1002  FAX: (415) 965 - 2658  MS 7L-590
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~






From guest  Mon Jan 10 11:56:48 1994
Date: Mon, 10 Jan 94 11:46:54 -0800
From: covingto@gravy5.cs.nps.navy.mil (james covington)
Message-Id: <9401101946.AA15285@gravy5.cs.nps.navy.mil>
To: info-performer@sgi.sgi.com
Subject: Performer and OSF/Motif
Status: O

Last week I wrote:

->I have reviewed Wade Olsen's sample program which shows how to run Performer
->inside a Motif application. However when I tried to modify a larger existing
->Performer application (one which used the standard winopen() call in the
->pfInitfunc) to run in this manner, I received GL error #114 (ERR_NOGRAPHICS)
->when I called the GLXlink function. Can you help explain what causes error
->#114, and what I could possibly do to avoid it?

    I want to thank you for the EXTREMELY fast response to my last posting
on this subject. I sent the mail late on Friday, and really didn't expect
any reply before the beginning of the week.

    Your suggestions were very helpful, and I am still working on the problem.

    At this point, I have taken a step backward and simply compiled Wade Olsen's
sample program with my original makefile and include files. When I ran the
program, it ran "successfully," but generated the error message:
	
	ERROR #4  ortho2: ERR_BADWINDOW

    twice, once when I called pfConfig, and again when I called XtRealizeWidget.
Can you tell me what conditions generate this error?

    I am running Performer 1.0 and Motif 1.1 on an IRIS 4D/440 Reality Engine
with IRIX 4.0.5G. Thanks.

    James Covington LT USN
    Naval Postgraduate School
    Monterey CA





From guest  Mon Jan 10 15:13:47 1994
From: "Sharon Fischler" <srf@rose>
Message-Id: <9401101252.ZM6238@rose.asd.sgi.com>
Date: Mon, 10 Jan 1994 12:52:03 -0800
In-Reply-To: covingto@gravy5.cs.nps.navy.mil (james covington)
        "Performer and OSF/Motif" (Jan 10, 11:46am)
References: <9401101946.AA15285@gravy5.cs.nps.navy.mil>
X-Mailer: Z-Mail-SGI (3.0S.1026 26oct93 MediaMail)
To: covingto@gravy5.cs.nps.navy.mil (james covington),
        info-performer@sgi.sgi.com
Subject: Re: Performer and OSF/Motif
Content-Type: text/plain; charset=us-ascii
Mime-Version: 1.0
Status: O

+>---- On Jan 10, 11:46am, james covington wrote:
> Subject: Performer and OSF/Motif
->Last week I wrote:
->
->->I have reviewed Wade Olsen's sample program which shows how to run Performer
->->inside a Motif application. However when I tried to modify a larger existing
->->Performer application (one which used the standard winopen() call in the
->->pfInitfunc) to run in this manner, I received GL error #114 (ERR_NOGRAPHICS)
->->when I called the GLXlink function. Can you help explain what causes error
->->#114, and what I could possibly do to avoid it?
->
->    I want to thank you for the EXTREMELY fast response to my last posting
->on this subject. I sent the mail late on Friday, and really didn't expect
->any reply before the beginning of the week.
->
->    Your suggestions were very helpful, and I am still working on the problem.
->
->    At this point, I have taken a step backward and simply compiled Wade Olsen's
->sample program with my original makefile and include files. When I ran the
->program, it ran "successfully," but generated the error message:
->	
->	ERROR #4  ortho2: ERR_BADWINDOW

This often means ortho() was sent some impossible arguments.
You could try using gldebug() to see what commands and values
are being sent to the graphics pipeline.

->
->    twice, once when I called pfConfig, and again when I called XtRealizeWidget.
->Can you tell me what conditions generate this error?
->
->    I am running Performer 1.0 and Motif 1.1 on an IRIS 4D/440 Reality Engine
->with IRIX 4.0.5G. Thanks.

Performer 1.2 supports running under GLX (and thus motif) very
well. Please forgive my previous mail that described 1.2.
You can certainly make GLX work in Performer 1.0/1.1, but it takes
a bit more work on your part.

srf.


FYI: this is a 1.0/1.1 compatible complex-glx.c 
/*
 * complex-glx.c
 * 
 * IRIS Performer example using mixed model (GLX) and
 * cull and draw process callbacks.  Mouse and
 * keyboard input are read through X in the application 
 * process to reduce overhead in the draw process.
 * Also demonstrates use of overlay planes with GLX.
 *
 * $Revision: 1.1 $ 
 * $Date: 93/07/13 08:18:11 $
 *
 * Run-time controls:
 *       ESC-key: exits
 *        F1-key: profile
 *    Left-mouse: advance
 *  Middle-mouse: stop
 *   Right-mouse: retreat
 */

#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#include <math.h>

#include <gl/glws.h>
#include <X11/keysym.h>

#include "pf.h"
#include "pfflt.h"
#include "pfsgi.h"

static void CullChannel(pfChannel *chan, void *data);
static void DrawChannel(pfChannel *chan, void *data);
static void OpenPipeline(pfPipe *p);
static void DrawOverlay(void);
static void UpdateView(void);
static void GetXInput(void);
static void usage(void);

#define HISPEED		0.1f
#define LOSPEED		0.001f

/*
 * structure that resides in shared memory so that the
 * application, cull, and draw processes can access it.
 */
typedef struct
{
    long        exitFlag;
    long        inWindow;
    float       mouseX;
    float	mouseY;
    long	mouseButtons;
    long	winOriginX;
    long	winOriginY;
    long	winSizeX;
    long	winSizeY;
    pfCoord	view;
    float	sceneSize;
    int		drawStats;
    Window	xWin;
    Window	glWin;
    Window	overWin;
    long	redrawOverlay;
} SharedData;

static SharedData *Shared;

/*
 * X Display for opening window and input.  In MP mode, each
 * process separately opens the display.
 */

static Display *XDpy = NULL;

/* light source created and updated in draw-process */

static pfLight *Sun;

/*
 *	main() -- program entry point. this procedure
 *	is executed in the application process.
 */

int
main (int argc, char *argv[])
{
    int		    arg;
    int		    found;
    pfNode	   *root;
    pfChannel      *chan;
    pfScene        *scene;
    pfPipe         *p;
    pfEarthSky     *eSky;
    pfBox           bbox;
    pfCoord         view;
    float	    far = 10000.0f;
    
    if (argc < 2)
	usage();
    
    pfInit();
    
    pfMultiprocess(PFMP_APPCULLDRAW);
    
    /* allocate shared before fork()'ing parallel processes */
    Shared = (SharedData*)pfMalloc(sizeof(SharedData), pfGetSharedArena());
    Shared->inWindow = 0;
    Shared->exitFlag = 0;
    Shared->drawStats = 0;
    Shared->redrawOverlay = 1;
    
    /* initiate multi-processing mode set in pfMultiprocess call */
    pfConfig();
    
    scene = pfNewScene();
    
    /* specify directories where geometry and textures exist */
    if (pfGetFilePath() == NULL)
        pfFilePath(
                   "."
                   ":./data"
                   ":../data"
                   ":../../data"
                   ":/usr/src/Performer/data"
                   );
    
    /* load database files named by command line arguments */
    for (arg = 1, found = 0; arg < argc; arg++)
    {
	if ((root = (pfNode *)LoadFlt(argv[arg])) != NULL)
	{
	    pfAddChild(scene, root);
	    found++;
	}
    }
    
    /* if no files successfully loaded, terminate program */
    if (!found)
	usage();
    
    /* determine extent of scene's geometry */
    pfGetNodeBBox(scene, &bbox, NULL);
    
    p = pfGetPipe(0);
    pfPhase(PFPHASE_FLOAT);
    
    /* Open and configure full screen GL window. */
    pfInitPipe(p, OpenPipeline);
    
    pfFrameRate(20.0f);
    
    chan = pfNewChan(p);
    pfChanCullFunc(chan, CullChannel);
    pfChanDrawFunc(chan, DrawChannel);
    pfChanScene(chan, scene);
    pfChanNearFar(chan, 0.1f, far);
    
    /* Create an earth/sky model that draws sky/ground/horizon */
    eSky = pfNewESky();
    pfESkyMode(eSky, PFES_BUFFER_CLEAR, PFES_SKY_GRND);
    pfESkyAttr(eSky, PFES_GRND_HT, -10.0f);
    pfChanESky(chan, eSky);
    
    /* vertical FOV is matched to window aspect ratio */
    pfChanFOV(chan, 45.0f, -1.0f);
    
    {
	float sceneSize;
	/* Set initial view to be "in front" of scene */
	
	/* view point at center of bbox */
	pfAddVec3(Shared->view.xyz, bbox.min, bbox.max);
	pfScaleVec3(Shared->view.xyz, 0.5f, view.xyz);
	
	/* find max dimension */
	sceneSize = bbox.max[PF_X] - bbox.min[PF_X];
	sceneSize = PF_MAX2(sceneSize, bbox.max[PF_Y] - bbox.min[PF_Y]);
	sceneSize = PF_MAX2(sceneSize, bbox.max[PF_Z] - bbox.min[PF_Z]);
	sceneSize = PF_MIN2(sceneSize, 0.5f * far);
	Shared->sceneSize = sceneSize;
	
	/* offset so all is visible */
	Shared->view.xyz[PF_Y] -=      sceneSize;
	Shared->view.xyz[PF_Z] += 0.25f*sceneSize;
	pfSetVec3(Shared->view.hpr, 0.0f, 0.0f, 0.0f);
	pfChanView(chan, Shared->view.xyz, Shared->view.hpr);
    }
    
    /* main simulation loop */
    while (!Shared->exitFlag)
    {
	/* wait until next frame boundary */
	pfSync();
	
	/* Set view parameters. */
	UpdateView();
	pfChanView(chan, Shared->view.xyz, Shared->view.hpr);
	
	/* initiate traversal using current state */
	pfFrame();

	/* Check the mouse and keyboard */
	GetXInput();
    }
    
    /* terminate cull and draw processes (if they exist) */
    pfExit();
    
    /* exit to operating system */
    exit(0);
}

/* 
 *	UpdateView() updates the eyepoint based on the information
 *	placed in shared memory by GetXInput().
 */
static void    
UpdateView(void)
{
    static float speed = 0.0f;
    static float speedLimit = 4.0f;
    pfCoord *view = &Shared->view;
    float cp;

    if (!Shared->inWindow)
    {
	speed = 0;
	return;
    }
    switch (Shared->mouseButtons)
    {
    case Button1Mask: /* LEFTMOUSE: faster forward or slower backward*/
	if (speed > 0.0f)
	    speed *= 1.2f;
	else
	    speed /= 1.2f;
	
	if (PF_ABSLT(speed, LOSPEED * Shared->sceneSize))
	    speed = LOSPEED * Shared->sceneSize;
	else if (speed >=  HISPEED * Shared->sceneSize)
	    speed = HISPEED * Shared->sceneSize;
	break;
    case Button2Mask:	/* MIDDLEMOUSE: stop moving and pick */
	speed = 0.0f;
	break;
    case Button3Mask: /* RIGHTMOUSE: faster backward or slower foreward*/
	if (speed < 0.0f)
	    speed *= 1.2f;
	else
	    speed /= 1.2f;
	
	if (PF_ABSLT(speed, LOSPEED * Shared->sceneSize))
	    speed = -LOSPEED * Shared->sceneSize;
	else if (speed <=  -HISPEED * Shared->sceneSize)
	    speed = -HISPEED * Shared->sceneSize;
	break;
    }

    /* update view direction */
    view->hpr[PF_H] -= Shared->mouseX * PF_ABS(Shared->mouseX);
    view->hpr[PF_P]  = Shared->mouseY * PF_ABS(Shared->mouseY) * 90.0f;
    view->hpr[PF_R]  = 0.0f;
    
    /* update view position */
    cp = cosf(PF_DEG2RAD(view->hpr[PF_P]));
    view->xyz[PF_X] += speed*sinf(-PF_DEG2RAD(view->hpr[PF_H])*cp);
    view->xyz[PF_Y] += speed*cosf(-PF_DEG2RAD(view->hpr[PF_H])*cp);
    view->xyz[PF_Z] += speed*sinf( PF_DEG2RAD(view->hpr[PF_P]));
}



/*
 * In Performer1.2: use pfInitGLXGfx() so that
 * windows can be automatically repositioned and
 * resized as needed.
 */
void
InitGLXGfx(pfPipe *_pipe, ulong _xwin, ulong _glwin, ulong _overwin)
{
    long zmin, zmax;

    zmin = getgdesc(GD_ZMIN);
    zmax = getgdesc(GD_ZMAX);
    lsetdepth(zmin, zmax);

    zbuffer(TRUE);
    subpixel(TRUE);
    mmode(MVIEWING);
    cpack(0);
    clear();
    zclear();
    swapbuffers();
    clear();
    zclear();

    /* XXX do the "right" thing here or in your own app */
    pfEnable(PFEN_TEXTURE);

    /* 
     * Apply default TV_MODULATE environment so geostates can inherit
     * for better performance.
    */
    pfApplyTEnv(pfNewTEnv(pfGetSharedArena()));
}

/* 
 * Prototypes for GLX utility code from 
 * /usr/people/4DGifts/examples/GLX/gl-Xlib/glxh2.c
 * which appears at the end of this file
 */

ulong	   GLXgetvalue(GLXconfig* conf, int buffer, int mode);
GLXconfig* GLXCreateWindow(Display* dpy,Window parent,
			   int x,int y,
			   int w,int h,
			   int borderWidth,
			   ...);

/*
 *	OpenPipeline() -- create a pipeline: setup the window system,
 *	the IRIS GL, and IRIS Performer. this procedure is executed in
 *	the draw process (when there is a separate draw process).
 */

static void
OpenPipeline(pfPipe *p)
{
    float xSize = 800;
    float ySize = 500;

    XSetWindowAttributes swa;
    XColor gray;
    GLXconfig *config;
    
    if (XDpy == NULL)
    {
	XDpy = XOpenDisplay(":0.0");
	if (!XDpy)
	    pfNotify(PFNFY_FATAL, PFNFY_RESOURCE, 
		     "OpenPipeline: couldn't open display\n");
    }
    
    /*
     * First create the top level X window.  The background will be
     * grey, and the window is only interested in key press events.
     */
    gray.red = 0x7fff; gray.green = 0x7fff; gray.blue = 0x7fff;
    XAllocColor(XDpy, DefaultColormap(XDpy, DefaultScreen(XDpy)), &gray);
    swa.background_pixel = gray.pixel;
    Shared->xWin = XCreateWindow(XDpy, RootWindow(XDpy, DefaultScreen(XDpy)),
				 100, 100, xSize, ySize,
				 0, CopyFromParent, 
				 InputOutput, CopyFromParent,
				 CWBackPixel, &swa);
    
    XStoreName(XDpy, Shared->xWin, "Performer GLX Test");
    
    /* create window for GL rendering */
#ifdef VENICE
    if (getgdesc(GD_MULTISAMPLE) > 0)
	config = GLXCreateWindow(XDpy, Shared->xWin, 0, 0, xSize, ySize, 0,
				 GLX_NORMAL, GLX_DOUBLE, TRUE,
				 GLX_NORMAL, GLX_RGB, TRUE,
				 GLX_NORMAL, GLX_ZSIZE, 0,
				 GLX_NORMAL, GLX_STENSIZE, 0,
				 GLX_NORMAL, GLX_MSSAMPLE, 8,
				 GLX_NORMAL, GLX_MSZSIZE, 24,
				 GLX_NORMAL, GLX_MSSSIZE, 1,
				 GLX_OVERLAY, GLX_BUFSIZE, 2,
				 0, 0, 0);
    else
#endif
	config = GLXCreateWindow(XDpy, Shared->xWin, 0, 0, xSize, ySize, 0,
				 GLX_NORMAL, GLX_DOUBLE, TRUE,
				 GLX_NORMAL, GLX_RGB, TRUE,
				 GLX_NORMAL, GLX_ZSIZE, GLX_NOCONFIG,
				 GLX_NORMAL, GLX_STENSIZE, 1,
				 GLX_OVERLAY, GLX_BUFSIZE, 2,
				 0, 0, 0);
    
    Shared->glWin = GLXgetvalue(config, GLX_NORMAL, GLX_WINDOW);
    Shared->overWin = GLXgetvalue(config, GLX_OVERLAY, GLX_WINDOW);
    XMapWindow(XDpy, Shared->glWin);
    XMapWindow(XDpy, Shared->xWin);
    XFlush(XDpy);

    /* initialize Performer for GLX rendering */
    InitGLXGfx(p, Shared->xWin, Shared->glWin, Shared->overWin);
    
    /* create a light source in the "south-west" (QIII) */
    Sun = pfNewLight(NULL);
    pfLightPos(Sun, -0.3f, -0.3f, 1.0f, 0.0f);
    
    /* create a default texture environment */
    pfApplyTEnv(pfNewTEnv(NULL));
    
    /* create a default lighting model */
    pfApplyLModel(pfNewLModel(NULL));
    
    /* enable culling of back-facing polygons */
    pfCullFace(PFCF_BACK);
    
    /*
     * These enables should be set to reflect the majority of the
     * database. If most geometry is not textured, then texture
     * should be disabled. However, you then need to change the
     * FLIGHT-format file reader. (pfflt.c)
     */
    pfEnable(PFEN_TEXTURE);
    pfEnable(PFEN_LIGHTING);
    pfEnable(PFEN_FOG);
}

/*
 *	CullChannel() -- traverse the scene graph and generate a
 * 	display list for the draw process.  This procedure is 
 *	executed in the cull process.
 */

static void
CullChannel(pfChannel *channel, void *data)
{
    /* 
     * pfDrawGeoSet or other display listable Performer routines
     * could be invoked before or after pfCull()
     */
    
    pfCull();
}

/*
 *	DrawChannel() -- draw a channel and read input queue. this
 *	procedure is executed in the draw process (when there is a
 *	separate draw process).
 */
static void
DrawChannel (pfChannel *channel, void *data)
{
    /* rebind light so it stays fixed in position */
    pfLightOn(Sun);
    
    /* erase framebuffer and draw Earth-Sky model */
    pfClearChan(channel);
    
    /* invoke Performer draw-processing for this frame */
    pfDraw();
    
    /* draw Performer throughput statistics */
    if (Shared->drawStats)
	pfDrawChanStats(channel);
    
    /* read window origin and size (it may have changed) */
    pfGetWindowSize(pfGetChanPipe(channel),
		    &Shared->winSizeX, &Shared->winSizeY);
    pfGetWindowOrigin(pfGetChanPipe(channel), 
		      &Shared->winOriginX, &Shared->winOriginY);

    if (Shared->redrawOverlay)
    {
	Shared->redrawOverlay = 0;
	DrawOverlay();
    }
}

/* leave FocusChange in XINMASK, since doesn't work in GLINMASK */
#define XINMASK (FocusChangeMask)

/*
 * want motion and button presses only within GL window area, 
 * parent X window focus includes window border
 */
#define GLINMASK (KeyPressMask	    | \
		  ButtonPressMask   | \
		  ButtonReleaseMask | \
		  ExposureMask      | \
		  PointerMotionMask)
static void
GetXInput(void)
{
    static long first = 1;
    XEvent ev;
    long newMouse = 0;
    long x, y;

    /* Display already open in single process mode */
    if (XDpy == NULL)
    {
	XDpy = XOpenDisplay(":0.0");
	if (!XDpy)
	    pfNotify(PFNFY_FATAL, PFNFY_RESOURCE, 
		     "GetXInput: couldn't open display\n");
    }
    if (first)
    {
	XSelectInput(XDpy, Shared->glWin, GLINMASK);
	XSelectInput(XDpy, Shared->xWin, XINMASK);
	first = 0;
    }
    while (XCheckWindowEvent(XDpy, Shared->glWin, GLINMASK, &ev))
    {
	switch (ev.type)
	{
	case Expose:
	    Shared->redrawOverlay = 1;
	    break;
	case ButtonPress:
	    switch (ev.xbutton.button)
	    {
	    case (1):
		Shared->mouseButtons = ev.xbutton.state | Button1Mask;
		break;
	    case (2):
		Shared->mouseButtons = ev.xbutton.state | Button2Mask;
		break;
	    case (3):
		Shared->mouseButtons = ev.xbutton.state | Button3Mask;
		break;
	    }
	    break;
	case ButtonRelease:
	    switch (ev.xbutton.button)
	    {
	    case (1):
		Shared->mouseButtons = ev.xbutton.state & ~Button1Mask;
		break;
	    case (2):
		Shared->mouseButtons = ev.xbutton.state & ~Button2Mask;
		break;
	    case (3):
		Shared->mouseButtons = ev.xbutton.state & ~Button3Mask;
		break;
	    }
	    break;
	case MotionNotify:
	    {
		newMouse = 1;
		x = ev.xmotion.x;
		y = ev.xmotion.y;
	    }
	    break;
	case KeyPress:
	    {
		KeySym ks;
		
		/*
		 * On a keypress, either rotate and re-display
		 * or exit.
		 */
		ks = XLookupKeysym(&ev.xkey, 0);
		switch (ks)
		{
		case XK_F1:
		    {
			Shared->drawStats = !Shared->drawStats;
			break;
		    } 
		case XK_Escape:
		    {
			Shared->exitFlag = 1;
			break;
		    }
		}
		break;
	    }
	}
    }
    while (XCheckWindowEvent(XDpy, Shared->xWin, XINMASK, &ev))
    {
	switch (ev.type)
	{
	case FocusIn:
	    break;
	case FocusOut:
	    Shared->inWindow = 0;
	    break;
	}
    }
    if (newMouse)
    {
	long xs, ys;
	Shared->mouseX =  2.0f*x/(float)Shared->winSizeX - 1.0f;
	Shared->mouseY = -2.0f*y/(float)Shared->winSizeY + 1.0f;
	Shared->inWindow = 1;
    }
}

static void
DrawOverlay(void)
{
    if (GLXwinset(XDpy, Shared->overWin) < 0)
    {
	pfNotify(PFNFY_WARN, PFNFY_SYSERR, 
		 "GLXwinset for overlay failed\n");
	return;
    }

    pfPushState();
    pfBasicState();
    zbuffer(FALSE);
    pfPushIdentMatrix();
    
    mapcolor(0, 0, 0, 0);
    mapcolor(1, 71, 9, 82);
    mapcolor(2, 0, 0, 0);
    gflush();
    
    color(0);
    clear();
    ortho2(-0.5, Shared->winSizeX - 0.5, -0.5, Shared->winSizeY - 0.5);
    cmov2(2, 2);
    color(1);
    charstr("GLX Overlay Test");
    
    pfPopMatrix();
    zbuffer(TRUE);
    pfPopState();

    if (GLXwinset(XDpy, Shared->glWin) < 0)
    {
	pfNotify(PFNFY_WARN, PFNFY_SYSERR, 
		 "GLXwinset for NORMAL window failed\n");
    }
}

/*
 *	usage() -- print usage advice and exit. This procedure
 *	is executed in the application process.
 */

static void
usage (void)
{
    fprintf(stderr, "Usage: complex-glx file.flt ...\n");
    pfExit();
    exit(1);
}

/*
 * /usr/people/4DGifts/examples/GLX/gl-Xlib/glxh2.c 
 *
 *     This file (companion to mix2.c) provides the helper function 
 *   "GLXCreateWindow", which does all the necessary magic to create 
 *    an X window suitable for GL drawing to take place within.  
 *    see the definition of GLXCreateWindow for a description of how 
 *    to call it.
 */

#include	<X11/Xlib.h>
#include	<X11/Xutil.h>
#include	<gl/glws.h>  
#include	<stdarg.h>
#include	<stdio.h>

/*
 ** Internal helper routines
 */

/* extract_visual:
 *  a visual is uniquely identified by a viusal identifier descibing the 
 *  visual and screen.  this function is used to get back the 
 *  GLX_NORMAL-GLX_VISUAL and the GLX_NORMAL-GLX_COLORMAP fields out of 
 *  the configuration data for use in creating a window using these data.
 *  XGetVisualInfo() returns a list of visual structures that match the 
 *  attributes explicitly specified in the template structure.
 */
static XVisualInfo*
extract_visual(Display* D, int S, GLXconfig *conf, int buffer)
{
    XVisualInfo	template, *v;
    int n;
    
    template.screen = S;
    template.visualid = GLXgetvalue(conf, buffer, GLX_VISUAL);
    return XGetVisualInfo (D, VisualScreenMask|VisualIDMask, &template, &n);
}



/* set_window() 
 *  search thru the current conf GL window structure looking for the 
 *  buffer that matches the mode of GLX_WINDOW so that we can go ahead 
 *  and assign the window W, (created via XCreateWindow below in 
 *  GLXCreateWindow) to the arg element.  We do this because in order 
 *  for this stuff to work, the "arg" element of the conf structure 
 *  must have the value field set to the X window id of the window 
 *  which was created.
 */
static void
set_window(GLXconfig* conf, int buffer, Window W)
{
    int	i;
    
    for (i = 0; conf[i].buffer; i++)
	if (conf[i].buffer == buffer && conf[i].mode == GLX_WINDOW)
	    conf[i].arg = W;
}


/*
 **  Used to get a value out of the configuration structure returned by
 **  GLXgetconfig.  Scan through the GLX config structure, and, when we
 **  find the proper buffer-mode combination, return the argument relevant 
 **  for that buffer type.
 */
unsigned long
GLXgetvalue(GLXconfig* conf, int buffer, int mode)
{
    int	i;
    for (i = 0; conf[i].buffer; i++)
	if (conf[i].buffer == buffer && conf[i].mode == mode)
	    return conf[i].arg;
    return 0;
}


/*
 * GLXCreateWindow(dpy, parent, x, y, w, h, boderWidth, arg_list, ...)
 *
 * Return value is the filled in config structure
 *
 * Arguments are:
 *	dpy		The X "Display*" returned by XOpenDisplay
 *	parent		The parent of the newly created window,
 *			a typical value for this is
 *			RootWindow(dpy, DefaultScreen(dpy))
 *	x,y		The location of the window to be created,
 *			y coordinate is measured from the top down.
 *	w,h		size of the new window
 *	borderWidth	the X border size for this window, should probably
 *			be zero.
 *	arg_list	Arguments to fill in initial config structure
 */
GLXconfig*
GLXCreateWindow(
		Display* dpy, Window parent,
		int x, int y, int w, int h,
		int borderWidth, ...)
{
    XSetWindowAttributes	init_attr;
    XWindowAttributes	read_attr;
    GLXconfig	init_config[50], *cp;
    GLXconfig	*retconfig;
    Window	win, normal_win;
    va_list	ap;
    int		buf, screen;
    XVisualInfo	*vis;
    
    /*
     ** Loop through the remaining arguments, copying all triples
     ** up to a zero-triple (or just plain zero if there are no
     ** triples), into the initial config structure.
     */
    va_start(ap, borderWidth);
    for (cp = init_config; buf = va_arg(ap, int); cp++) {
	cp->buffer = buf;
	cp->mode = va_arg(ap, int);
	cp->arg = va_arg(ap, int);
    }
    cp->buffer = cp->mode = cp->arg = 0;
    
    /*
     ** Now that we have the configuration request, call GLXgetconfig to
     ** get back real configuration information.
     */
    XGetWindowAttributes(dpy, parent, &read_attr);
    screen = XScreenNumberOfScreen(read_attr.screen);
    if ((retconfig = GLXgetconfig(dpy, screen, init_config)) ==  0) {
	pfNotify(PFNFY_FATAL, PFNFY_RESOURCE,
		 "Hardware doesn't support that window type\n");
    }
    
    /*
     ** Now we have the information needed to actually create the
     ** windows.  There is always a normal window, so we create that
     ** one first.
     **
     ** Basically we extract the GLX_NORMAL,GLX_VISUAL and the
     ** GLX_NORMAL,GLX_COLORMAP fields out of the configuration 
     *  data, and create a window using these data.
     ** When we are done we save the X ID of the new window in
     ** the configuration structure (using set_window()).  GLXlink,
     ** and the caller of GLXCreateWindow will be interested in 
     ** this value.
     ** note the explicit definition of the init_attr.colormap 
     ** element:  we aren't sure if our visual is the same as our 
     ** parent's, and we'd like to not care.  since our colormap 
     ** and visual MUST be of the same depth and class (else the
     ** BadMatch error will bite), we pass a colormap which we 
     ** know will match our visual.  If we don't do this, we 
     ** inherit from our parent and all bets are off..
     */
    vis = extract_visual(dpy, screen, retconfig, GLX_NORMAL);
    init_attr.colormap = GLXgetvalue(retconfig, GLX_NORMAL, GLX_COLORMAP);
    init_attr.border_pixel = 0;	/* Must exist, otherwise BadMatch error */
    normal_win = XCreateWindow (dpy, parent, x, y, w, h, borderWidth,
		                vis->depth, InputOutput, vis->visual,
		                CWColormap|CWBorderPixel, &init_attr);
    set_window(retconfig, GLX_NORMAL, normal_win);
    
    /*
     ** If overlay planes were requested in the configuration, and 
     ** they are available, the GLX_OVERLAY,GLX_BUFSIZE arg field in 
     ** the returned configuration will be non zero.  If this is the 
     ** case, we create another window, in the overlay planes, a child 
     ** of the normal planes window.  The size is 2K x 2K so that the 
     ** overlay window will never have to be resized, it will always 
     ** be clipped by the size of its parent.
     */
    if (GLXgetvalue(retconfig, GLX_OVERLAY, GLX_BUFSIZE)) {
	vis = extract_visual(dpy, screen, retconfig, GLX_OVERLAY);
	init_attr.colormap = GLXgetvalue(retconfig,GLX_OVERLAY,GLX_COLORMAP);
	win = XCreateWindow (dpy, normal_win, 0, 0, 2000, 2000, 0,
		             vis->depth, InputOutput, vis->visual,
		             CWColormap|CWBorderPixel, &init_attr);
	XMapWindow(dpy, win);
	set_window(retconfig, GLX_OVERLAY, win);
    }
    
    /*
     ** Do exactly the same stuff, but this time for the popup planes
     ** when we are running on a machine that has no OVERLAY planes.
     */
    if (GLXgetvalue(retconfig, GLX_POPUP, GLX_BUFSIZE)) {
	vis = extract_visual(dpy, screen, retconfig, GLX_POPUP);
	init_attr.colormap = GLXgetvalue(retconfig,GLX_POPUP,GLX_COLORMAP);
	win = XCreateWindow (dpy, normal_win, 0, 0, 2000, 2000, 0,
		             vis->depth, InputOutput, vis->visual,
		             CWColormap|CWBorderPixel, &init_attr);
	XMapWindow(dpy, win);
	set_window(retconfig, GLX_POPUP, win);
    }
    
    /* now do the final step:  configure the X window for GL rendering.
     ** this informs the GL that we intend to render GL into an X window.
     ** at this point, the retconfig structure contains all the 
     ** information necessary to ensure that X and GL know about each 
     ** other and will behave in a responsible manner...
     */
    if (GLXlink(dpy, retconfig) < 0) {
	pfNotify(PFNFY_FATAL, PFNFY_SYSERR, "GLXlink failed\n");
    }
    
    /* finally do what winopen() always did:  explicitly set the current
     ** GL window to be this new mixed model window.
     */
    GLXwinset(dpy, normal_win);
    
    return retconfig;
}




-- 
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Sharon Rose Fischler - Silicon Graphics, Advanced Graphics Development
srf@sgi.com  (415) 390 - 1002  FAX: (415) 965 - 2658  MS 7L-590
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~







From guest  Mon Jan 10 17:18:47 1994
From: "Wade Olsen" <wade@fnord>
Message-Id: <9401101718.ZM16684@fnord.asd.sgi.com>
Date: Mon, 10 Jan 1994 17:18:22 -0800
In-Reply-To: covingto@gravy5.cs.nps.navy.mil (james covington)
        "Performer and OSF/Motif" (Jan 10, 11:46am)
References: <9401101946.AA15285@gravy5.cs.nps.navy.mil>
X-Mailer: Z-Mail-SGI (3.0S.1026 26oct93 MediaMail)
To: covingto@gravy5.cs.nps.navy.mil (james covington),
        info-performer@sgi.sgi.com
Subject: Re: Performer and OSF/Motif
Content-Type: text/plain; charset=us-ascii
Mime-Version: 1.0
Status: O

On Jan 10, 11:46am, james covington wrote:
> Subject: Performer and OSF/Motif
> Last week I wrote:
> 
> ->I have reviewed Wade Olsen's sample program which shows how to run Performer
> ->inside a Motif application. However when I tried to modify a larger existing
> ->Performer application (one which used the standard winopen() call in the
> ->pfInitfunc) to run in this manner, I received GL error #114 (ERR_NOGRAPHICS)
> ->when I called the GLXlink function. Can you help explain what causes error
> ->#114, and what I could possibly do to avoid it?
> 
>     I want to thank you for the EXTREMELY fast response to my last posting
> on this subject. I sent the mail late on Friday, and really didn't expect
> any reply before the beginning of the week.
> 
>     Your suggestions were very helpful, and I am still working on the problem.
> 
>     At this point, I have taken a step backward and simply compiled Wade Olsen's
> sample program with my original makefile and include files. When I ran the
> program, it ran "successfully," but generated the error message:
> 	
> 	ERROR #4  ortho2: ERR_BADWINDOW
> 

The sample program has definitions for the GL routines getsize and 
getorigin.  These are faster versions than the GL counterparts because the 
GL must make a request to the X server and wait for a responce.  But since 
this application watches for resize events it knows what the window size
is.  But if performer asks for the window size before the app gets some
indication of the window size then performer might be using garbage from
my version of getsize.  A quick and resonable fix might be to stick some
default values in win_x_size and win_y_size right after they are allocated
out of shared memory.  I wrote this example using Perf1.1 on IRIX 5.*.
I'll bet that compiler differences and not initializing these variables
is the culprit.  Sorry.

Regarding applying this approach to an existing application, be careful!
The order things happen in is very critical.  It might be easier to take 
a working program and make incremental changes (the example for instance)
and morph it into your final application.  Then again, maybe not :-).

I'm trying to come up with a multi-pipe version of this.  I'll post it here
when I can get it working.

>     twice, once when I called pfConfig, and again when I called XtRealizeWidget.
> Can you tell me what conditions generate this error?
> 
>     I am running Performer 1.0 and Motif 1.1 on an IRIS 4D/440 Reality Engine
> with IRIX 4.0.5G. Thanks.
> 
>     James Covington LT USN
>     Naval Postgraduate School
>     Monterey CA
> 
> 
> 
> 
> 
>-- End of excerpt from james covington



-- 
-------------------------------------------------------------------------------
Wade Olsen, wade@sgi.com, 415-390-1023, Silicon Graphics Computer Systems






From guest  Wed Jun 15 18:40:00 1994
Return-Path: <aono@trl.ibm.co.jp>
Message-Id: <9406160140.AA23125@ns.trl.ibm.com>
To: info-performer
Cc: aono@trl.ibm.co.jp
Subject: X-Motif + performer sample program
Date: Thu, 16 Jun 1994 10:40:03 +0900
From: Masaki Aono <aono@trl.ibm.co.jp>
Status: O

Dear Sirs/Madams:

	Is there a sample program that uses OSF/Motif as GUI in 
Performer's program? I find that the sample program "intersect.c"
uses GL(qdevice(),qtest(), and qread()) as GUI (see "Pipeline",
March/April 1994, Vol.5, No.2).

What I'd like to get is a sample program that uses Performer's 
libraries and X/Motif's widgets (such as Push Button widget to 
quit) alone, without including GL libraries such as "<gl/gl.h>" and
"<gl/device.h>".
Specifically, is it possible to replace Openpipeline() and
DrawChannel() by similar functions using Motif widgets?


Regards,
Masaki Aono
E-mail: aono@trl.ibm.co.jp




From guest  Tue Jun 21 10:22:00 1994
From: "Wade Olsen" <wade@fnord>
Message-Id: <9406211021.ZM14668@fnord.asd.sgi.com>
Date: Tue, 21 Jun 1994 10:21:41 -0700
In-Reply-To: Masaki Aono <aono@trl.ibm.co.jp>
        "X-Motif + performer sample program" (Jun 16, 10:40am)
References: <9406160140.AA23125@ns.trl.ibm.com>
X-Mailer: Z-Mail-SGI (3.0S.1026 26oct93 MediaMail)
To: Masaki Aono <aono@trl.ibm.co.jp>, info-performer
Subject: Re: X-Motif + performer sample program
Content-Type: text/plain; charset=us-ascii
Mime-Version: 1.0
Status: OR

On Jun 16, 10:40am, Masaki Aono wrote:
> Subject: X-Motif + performer sample program
> Dear Sirs/Madams:
>
> 	Is there a sample program that uses OSF/Motif as GUI in
> Performer's program? I find that the sample program "intersect.c"
> uses GL(qdevice(),qtest(), and qread()) as GUI (see "Pipeline",
> March/April 1994, Vol.5, No.2).
>
> What I'd like to get is a sample program that uses Performer's
> libraries and X/Motif's widgets (such as Push Button widget to
> quit) alone, without including GL libraries such as "<gl/gl.h>" and
> "<gl/device.h>".
> Specifically, is it possible to replace Openpipeline() and
> DrawChannel() by similar functions using Motif widgets?
>
>
> Regards,
> Masaki Aono
> E-mail: aono@trl.ibm.co.jp
>
>
>
>
>-- End of excerpt from Masaki Aono

Here you go:

To extract, save this message to a file, do a "uudecode
<saved_file_name>", then a "tar xvfo performer_motif.tar"

-----------------------------------------------------------------------
begin 644 performer_motif.tar
M<&5R9F]R;65R7VUO=&EF+P``````````````````````````````````````
M````````````````````````````````````````````````````````````
M`````````````#`P,#<U-2``,#`T,3<W(``P,#`P,C0@`#`P,#`P,#`P,#`P
M(#`U-3`T,3<U,S4Q(#`Q-#(R,0`@-0``````````````````````````````
M````````````````````````````````````````````````````````````
M``````````````````````````````````````````!U<W1A<@`P,'=A9&4`
M````````````````````````````````````=7-E<@``````````````````
M```````````````````P,#`P,#`@`#`P,#`P,"``````````````````````
M````````````````````````````````````````````````````````````
M````````````````````````````````````````````````````````````
M````````````````````````````````````````````````````````````
M``````````````````````!P97)F;W)M97)?;6]T:68O36%K969I;&4`````
M````````````````````````````````````````````````````````````
M````````````````````````````````````,#`P-C0T(``P,#0Q-S<@`#`P
M,#`R-"``,#`P,#`P,#`W,3(@,#4T-#$T,S$P,38@,#$U-C4R`"`P````````
M````````````````````````````````````````````````````````````
M````````````````````````````````````````````````````````````
M`````'5S=&%R`#`P=V%D90````````````````````````````````````!U
M<V5R`````````````````````````````````````#`P,#`P,"``,#`P,#`P
M(```````````````````````````````````````````````````````````
M````````````````````````````````````````````````````````````
M````````````````````````````````````````````````````````````
M`````````````````````````````````````````````",A<VUA:V4*(PH*
M:6YC;'5D92`D*%)/3U0I+W5S<B]I;F-L=61E+VUA:V4O8V]M;6]N9&5F<PH*
M5$%21T544R`]("!P9DUO=&EF"D,K*T9)3$53(#T@('!F36]T:68N8RLK"@I/
M4%1)34E:15(@/2`M3S(*3$,K*TE.0U,@/2`M221[4D]/5'TO=7-R+VEN8VQU
M9&4O6#$Q+UAI<FES=R`M221[4D]/5'TO=7-R+VEN8VQU9&4O4V=M"DQ#*RM$
M1493(#T@+41&54Y#4%)/5$\@)'M214Q%05-%7T9,04=3?0H*3$1&3$%'4PD]
M("U,+W5S<B]S<F,O4&5R9F]R;65R+VQI8B`M;'!F9FQT("UL<&8@+6QP<B!<
M"@D)+6QI;6%G92`M;&9P92`M;%AI<FES=R`M;%AM("UL6'0@+6QG;"`M;%@Q
M,2!<"@D)+6QM("UL;6%L;&]C("UL9V5N"@ID969A=6QT.B`D*%1!4D=%5%,I
M"@II;F-L=61E("0H0T]-34].4E5,15,I"@H*)"A405)'1513*3H@)"A/0DI%
M0U13*0H))"A#*RM&*2`M;R`D0"`D*$]"2D5#5%,I("0H3$1&3$%'4RD*!*8/
MO"+H```````````/K"F0`````!``8G@0`)1N`````'__CM`0``@D$``(*`^T
MQT``````<&5R9F]R;65R7VUO=&EF+W!F36]T:68N8RLK````````````````
M````````````````````````````````````````````````````````````
M`````````````````````#`P,#8T-"``,#`T,3<W(``P,#`P,C0@`#`P,#`P
M,#0P-38R(#`U-#0S-3`R,#4Q(#`Q-C$Q-P`@,```````````````````````
M````````````````````````````````````````````````````````````
M``````````````````````````````````````````````````!U<W1A<@`P
M,'=A9&4`````````````````````````````````````=7-E<@``````````
M```````````````````````````P,#`P,#`@`#`P,#`P,"``````````````
M````````````````````````````````````````````````````````````
M````````````````````````````````````````````````````````````
M````````````````````````````````````````````````````````````
M```````````````````````````````O*@H*<&9-;W1I9@H*5V%D92!/;'-E
M;@I3:6QI8V]N($=R87!H:6-S($-O;7!U=&5R(%-Y<W1E;7,*,3DY,PH*5&AE
M('!U<G!O<V4@;V8@=&AI<R!P<F]G<F%M('1O('!R;W9I9&4@86X@97AA;7!L
M92!O9B!H;W<@=&\@=7-E($E225,*4&5R9F]R;65R(&EN(&$@36]T:68@87!P
M;&EC871I;VXN("!5<VEN9R!T:&4@;75L=&EP;&4@<')O8V5S<R!M;V1E;`IA
M=F%I;&%B;&4@:6X@4&5R9F]R;65R(&-A;B!G<F5A=&QY(&EM<')O=F4@<&5R
M9F]R;6%N8V4@;V8@,T0*87!P;&EC871I;VYS+@H*56YF;W)T=6YA=&5L>2P@
M=&AI<R!S86UE('!R;V-E<W-I;F<@;6]D96P@;6%K97,@;&EF92!M;W)E(&1I
M9F9I8W5L="!F;W(*<V]M96]N92!W:&\@=V%N=',@=&\@:&%V92!A(&YI8V4@
M=7-E<B!I;G1E<F9A8V4@=&\@=&AE:7(@87!P;&EC871I;VXN"E=H>2!I<R!T
M:&%T+"!Y;W4@;6EG:'0@87-K/R`@57-E<B!I;G1E<F9A8V4@<W1R=6-T=7)E
M(&%N9"!E=F5N=`IH86YD;&EN9R!I<R!A;&UO<W0@86QW87ES(&)E<W0@:&%N
M9&QE9"!I;B!T:&4@87!P;&EC871I;VX@<')O8V5S<RP@;F]T"FEN('1H92!D
M<F%W('!R;V-E<W,N("!"=70@=&AE(&1R87<@<')O8V5S<R!M=7-T(&AA=F4@
M97AC;'5S:79E"F]W;F5R<VAI<"!O9B!I=',@;W=N($=,(&-O;G1E>'0@86YD
M('1Y<&EC86QL>2!D;V5S('-O(&)Y(&]P96YI;F<@:71S"F]W;B!W:6YD;W<N
M("!3=')U8W1U<FEN9R!T:&4@87!P;&EC871I;VX@=&AI<R!W87D@=7-U86QL
M>2!M96%N<R!T:&4*9')A=R!P<F]C97-S(&=E=',@=&AE('5S97(@:6YT97)F
M86-E(&5V96YT<R!A;F0@;75S="!S;VUE(&AO=R!S96YD"G1H96X@=&\@=&AE
M(&1R87<@<')O8V5S<RX@($%N;W1H97(@<V]L=71I;VX@:7,@9F]R('1H92!A
M<'!L:6-A=&EO;@IP<F]C97-S('1O(&]P96X@86X@:6YV:7-I8FQE("AI;G!U
M="!O;FQY*2!W:6YD;W<@;W9E<B!T:&4@9')A=PIP<F]C97-S97,@=VEN9&]W
M('1O(&-A<'1U<F4@979E;G1S+B`@5&AE(&%P<')O86-H('!R;V1U8V5S('1H
M90IH96%D86-H92!O9B!M86YA9VEN9R!W:&%T(&AA<'!E;G,@=VAE;B!T:&4@
M=7-E<B!I;G1E<F9A8V4@:7,@;6]V960L"G)E<VEZ960L(&]R(&EC;VYI9FEE
M9"X@(%1H97-E(&ES<W5E<R!A<F4@8F5S="!L969T('1O('=I;F1O=R!M86YA
M9V5R<PIA;F0@=&]O;&MI=',N"@I!;F]T:&5R('-O;'5T:6]N('1O('1H:7,@
M<')O8FQE;2!I<R!O=71L:6YE9"!I;B!T:&4@97AA;7!L92!B96QO=RX*5&AI
M<R!P<F]G<F%M(&9O;&QO=W,@=&AE<V4@<W1E<',Z"@HQ+B!296%D(&$@375L
M=&EG96X@9FQI9VAT(&9I;&4@<W!E8VEF:65D(&]N('1H92!C;VUM86YD(&QI
M;F4N"@HR+B!"=6EL9"!T:&4@=7-E<B!I;G1E<F9A8V4L(&EN8VQU9&EN9R!A
M($=,6"!W:61G970L(&%N9"`B<F5A;&EZ92(@=&AE"E5)+@H*,RX@16YT97(@
M=&AE(%AT(&5V96YT(&QO;W`N"@HT+B!7:&5N('1H92!'3%@@=VED9V5T(&ES
M(")R96%L:7IE(B!A($=)3DE4(&-A;&QB86-K(&ES('!R;V1U8V5D+B`@26X*
M=&AE(&-A;&QB86-K(')O=71I;F4@*'-E92!R961R87<H*2!B96QO=RD@=&AE
M(&%P<&QI8V%T:6]N(')E;6]V97,@:71S"F5X8VQU<VEV92!H;VQD(&]N('1H
M92!'3%@@=VED9V5T+B`@5&AE;BP@4&5R9F]R;65R(&ES('1O;&0@=&\*:6YI
M=&EA;&EZ92!T:&4@9')A=R!P<F]C97-S+@H*-2X@26X@=&AE(&1R87<@<')O
M8V5S<RP@4&5R9F]R;65R(&-A;&QS('1H92!O<&5N1TQ88V]N;F5C=&EO;B@I
M"F-A;&QB86-K('1O(")C<F5A=&4B('1H92!'3"!W:6YD;W<@=&\@9')A=R!I
M;BX@($EN<W1E860L('1H92!C86QL8F%C:PIJ=7-T(&QI;FMS('1O('1H92!E
M>&ES=&EN9R!'3%@@=VED9V5T(&-R96%T960@8GD@=&AE(&%P<&QI8V%T:6]N
M"G!R;V-E<W,N"@I4:&ES(&YI8V4@=&AI;F<@86)O=70@=&AI<R!A<'!R;V%C
M:"!I<R!T:&4@9')A=R!P<F]C97-S97,@=VEN9&]W(&ES"G-T:6QL(&$@8VAI
M;&0@;V8@=&AE('=I9&=E=',@:6X@=&AE(&%P<&QI8V%T:6]N('!R;V-E<W,N
M("!4:'5S+"!E=F5N=`IH86YD;&EN9R!A;F0@=VEN9&]W(&UA;F%G96UE;G0@
M:7,@9W)E871L>2!S:6UP;&EF:65D+@H**B\*"B-I;F-L=61E(#QS=&1I;RYH
M/@HC:6YC;'5D92`\<W1D;&EB+F@^"B-I;F-L=61E(#QL:6)G96XN:#X*(VEN
M8VQU9&4@/'-Y<R]T>7!E<RYH/@HC:6YC;'5D92`\<VEG;F%L+F@^"B-I;F-L
M=61E(#Q8,3$O26YT<FEN<VEC+F@^"B-I;F-L=61E(#Q8;2]$<F%W:6YG02YH
M/@HC:6YC;'5D92`\6&TO5&]G9VQE0BYH/@HC:6YC;'5D92`\6&TO1F]R;2YH
M/@HC:6YC;'5D92`\6&TO4F]W0V]L=6UN+F@^"B-I;F-L=61E(#Q';'A-1')A
M=RYH/@HC:6YC;'5D92`\9VPO9VPN:#X*(VEN8VQU9&4@/&UA=&@N:#X*(VEN
M8VQU9&4@/%!E<F9O<FUE<B]P9BYH/@HC:6YC;'5D92`\4&5R9F]R;65R+W!F
M9FQT+F@^"@IS=&%T:6,@6'1!<'!#;VYT97AT(&%P<%]C;VYT97AT.R\O($%N
M(%AT('1H:6YG>0H*"0D)"2\O(%1H:7,@<W1R=6-T=7)E(&ES('=H97)E(&%P
M<&QI8V%T:6]N"@D)"0DO+R!R97-O=7)C97,@=VEL;"!B92!R96%D(&9R;VTN
M"G1Y<&5D968@<W1R=6-T('L*("`@(&EN=`D);7!?;6]D93L)+R\@4&5R9F]R
M;65R(&UU;'1I<')O8V5S<VEN9R!M;V1E+@I]($%P<$1A=&$L("I!<'!$871A
M4'1R.PH*"0D)"2\O(%1H97-E(&%R92!T:&4@<F5S;W5R8V5S('1H90H)"0D)
M+R\@87!P;&EC871I;VX@:7,@:6YT97)E<W1E9"!I;BX*<W1A=&EC(%AT4F5S
M;W5R8V4@<F5S;W5R8V5S6UT@/2!["GL@(FUP7VUO9&4B+"`B37!?;6]D92(L
M(%AT4DEN="P@<VEZ96]F*&EN="DL"B`@6'1/9F9S970H07!P1&%T85!T<BP@
M;7!?;6]D92DL(%AT4DEM;65D:6%T92P@*&-A9&1R7W0I+3$@?2P*?3L*"@D)
M"0DO+R!4:&4@8V]M;6%N9"!L:6YE(&]P=&EO;G,N"G-T871I8R!8<FU/<'1I
M;VY$97-C4F5C(&]P=&EO;G-;72`]('L*>R`B+6UP(BP@(BIM<%]M;V1E(BP@
M6')M;W!T:6]N4V5P07)G+"!.54Q,('TL"GT["@IS=&%T:6,@9FQO870@9&EA
M;65T97(["0DO+R!$:6%M971E<B!O9B!T:&4@;6]D96P@=V4G<F4@;&]O:VEN
M9R!A="X*<W1A=&EC(&9L;V%T(&1I<W1A;F-E.PD)+R\@1&ES=&%N8V4@9G)O
M;2!T:&4@;6]D96P@=&\@=&AE(&5Y92X*"G-T871I8R!P9E9E8S,@=FEE=U]C
M96YT97(["2\O(%1H92!P;VEN="!T:&4@=FEE=V5R(&QO;VMS(&%T+@IS=&%T
M:6,@9FQO870@=FEE=U]A>FEM.PD)+R\@5FEE=V5R(')O=&%T:6]N<RX*<W1A
M=&EC(&9L;V%T('9I97=?:6YC;#L)"2\O(`H*<W1A=&EC('!F4&EP92`J('1H
M95!I<&4["2\O(%1H92!P97)F;W)M97(@<&EP92!O8FIE8W0*<W1A=&EC('!F
M0VAA;FYE;"`J('1H94-H86YN96P["2\O(%1H92!P97)F;W)M97(@8VAA;FYE
M;"!I;B!T:&4@<&EP92X*"G-T871I8R!I;G0@;6]U<V5?>%]P;W,["0DO+R!#
M=7)R96YT(&UO=7-E('!O<VET:6]N+B`*<W1A=&EC(&EN="!M;W5S95]Y7W!O
M<SL*<W1A=&EC(&EN="`J('=I;E]X7W-I>F4["2\O($-U<G)E;G0@1TQ8('=I
M;F1O=R!S:7IE("A3=&]R960@:6X*<W1A=&EC(&EN="`J('=I;E]Y7W-I>F4[
M"2\O('-H87)E9"!M96UO<GD@9F]R(&1R87<@<')O8V5S<R!T;R!R96%D*2X*
M"@D)"0DO+R!4:&ES('-T<G5C='5R92P@<&QA8V5D(&EN('-H87)E9`H)"0D)
M+R\@;65M;W)Y+"!I<R!R96%D(&)Y('1H92!D<F%W('!R;V-E<W,*"0D)"2\O
M('1O(&%T=&%C:"!T;R!T:&4@1TQ8('=I9&=E="X*<W1A=&EC('-T<G5C="!G
M;'A?:6YF;U]S=')U8W0@>PH@("`@8VAA<B`J(&1I<W!L87E?;F%M93L*("`@
M(%=I;F1O=R!X5VEN9&]W.PI]("H@9VQX7VEN9F\["@H)"0D)+R\@06QS;R!P
M;&%C960@:6X@<VAA<F5D(&UE;6]R>2P@=&AI<PH)"0D)+R\@<W1R=6-T=7)E
M(&ES('5S960@=&\@96YA8FQE+V1I<V%B;&4*"0D)"2\O(&1R87=I;F<@;6]D
M97,N"F5N=6T@>R!-3T1%7U=)4D5&4D%-12P@34]$15]415A455)%+"!.54U?
M34]$15,@?3L*"G-T871I8R!S=')U8W0@9')A=U]M;V1E7W-T<G5C="!["B`@
M("!I;G0@;6]D97-;3E5-7TU/1$5373L*("`@(&EN="!R96%D.PD)"2\O($-O
M=6YT97)S('1O(&EN9&EC871E(&-H86YG97,N"B`@("!I;G0@=W)I=&4["GT@
M*B!D<F%W7VUO9&5S.PH*"0D)"2\O(%1H:7,@;&ES="!D97-C<FEB97,@=&AE
M($=,6"!W:61G970*"0D)"2\O('1O(&)E(&-R96%T960N("!'3%A?3D]#3TY&
M24<@;65A;G,*"0D)"2\O(")G:79E(&UE('1H92!B:6=G97-T+B(*<W1A=&EC
M($=,6&-O;F9I9R!R96=U;&%R1VQX0V]N9FEG(%M=(#T@>PH@("`@1TQ87TY/
M4DU!3"P@1TQ87T)51E-)6D4L("`)1TQ87TY/0T].1DE'+`H@("`@1TQ87TY/
M4DU!3"P@1TQ87UI325I%+"`@"4=,6%].3T-/3D9)1RP*("`@($=,6%].3U)-
M04PL($=,6%]$3U5"3$4L"512544L"B`@("!'3%A?3D]234%,+"!'3%A?4D="
M+"`@(`E44E5%+`H@("`@1TQ87TY/4DU!3"P@1TQ87U=)3D1/5RP)1TQ87TY/
M3D4L"B`@("`P+"`P+"`P+`I].PH*"B\O($%N(%AT(&-A;&QB86-K(&9U;F-T
M:6]N(&-A;&QE9"!W:&5N(&$@(F1R87<@;6]D92(@8G5T=&]N(&ES"B\O('1O
M9V=L960N"@IS=&%T:6,@=F]I9"`*;6]D94-"*%=I9&=E="P@:6YT(&UO9&4L
M(%AM5&]G9VQE0G5T=&]N0V%L;&)A8VM3=')U8W0@*B!C8BD*>PH@("`@9')A
M=U]M;V1E<RT^;6]D97-;;6]D95T@/2!C8BT^<V5T.PH@("`@9')A=U]M;V1E
M<RT^=W)I=&4K*SL*?0H*"B\O(%1H:7,@9G5N8W1I;VX@:7,@8V%L;&5D(&9R
M;VT@=&AE(%!E<F9O<FUE<B!D<F%W('!R;V-E<W,@=&\@8V]N;F5C=`HO+R!T
M;R!T:&4@1TQ8('=I9&=E="!C<F5A=&5D(&EN('1H92!A<'!L:6-A=&EO;B!P
M<F]C97-S+B`@270@9V5T<R!T:&4*+R\@=VEN9&]W(&ED(&]U="!O9B!A('-T
M<G5C='5R92`H9VQX7VEN9F\I(&EN('-H87)R960@;65M;W)Y+@H*<W1A=&EC
M('9O:60*;W!E;D=,6&-O;FYE8W1I;VXH*0I["B`@("!$:7-P;&%Y("H@9&ES
M<&QA>2`](%A/<&5N1&ES<&QA>2AG;'A?:6YF;RT^9&ES<&QA>5]N86UE*3L*
M("`@(%=I;F1O=R!G;'A?=VEN9&]W(#T@9VQX7VEN9F\M/GA7:6YD;W<["B`@
M("`*("`@(%A7:6YD;W=!='1R:6)U=&5S(&%T=')I8G5T97,["B`@("!81V5T
M5VEN9&]W071T<FEB=71E<RAD:7-P;&%Y+"!G;'A?=VEN9&]W+"`F(&%T=')I
M8G5T97,I.PH@("`@:6YT('-C<F5E;DYO(#T@6%-C<F5E;DYU;6)E<D]F4V-R
M965N*&%T=')I8G5T97,N<V-R965N*3L*"@D)"0DO+R!5<V4@=&AE('-A;64@
M8V]N9FEG=7)A=&EO;B!H97)E"@D)"0DO+R!T:&%T('=A<R!U<V5D(&EN(&-R
M96%T:6YG('1H90H)"0D)+R\@=VED9V5T+@H@("`@1TQ88V]N9FEG("H@8V]N
M9FEG.PH@("`@8V]N9FEG(#T@1TQ89V5T8V]N9FEG*&1I<W!L87DL('-C<F5E
M;DYO+"!R96=U;&%R1VQX0V]N9FEG*3L*("`@(&EF("AC;VYF:6<@/3T@,"D*
M("`@('L*"69P<FEN=&8H<W1D97)R+"`B3F\@=FES=6%L(&9O=6YD('1O(&UA
M=&-H(')E<75E<W0@:6X@1TQ89V5T8V]N9FEG7&XB*3L*"65X:70H,2D["B`@
M("!]"@H)"0D)+R\@1FEN9"!T:&4@=VEN9&]W(&5N=')Y(&%N9"!S970@:70@
M=&\*"0D)"2\O(&AA=F4@=&AE('-A;64@=VEN9&]W(&ED(&]F('1H90H)"0D)
M+R\@1TQ8=VED9V5T)W,@=VEN9&]W+@H@("`@9F]R("AI;G0@:2`](#`[(&-O
M;F9I9UMI72YB=69F97([(&DK*RD*"6EF("AC;VYF:6=;:5TN8G5F9F5R(#T]
M($=,6%].3U)-04P@)B8*"2`@("!C;VYF:6=;:5TN;6]D92`]/2!'3%A?5TE.
M1$]7*0H)>PH)("`@(&-O;F9I9UMI72YA<F<@/2`H:6YT*6=L>%]W:6YD;W<[
M"@E]"@H)"0D)+R\@0V]N;F5C="!T:&4@1TP@8V]N=&5X="!T;R!T:&4*"0D)
M"2\O($=,6'=I9&=E="!C<F5A=&5D(&)Y('1H90H)"0D)+R\@87!P;&EC871I
M;VX@<')O8V5S<RX*("`@(&EF("A'3%AL:6YK*&1I<W!L87DL(&-O;F9I9RDI
M"B`@("!["@EF<')I;G1F*'-T9&5R<BP@(D5R<F]R(&EN($=,6&QI;FM<;B(I
M.PH)97AI="@Q*3L*("`@('T*"@D)"0DO+R!-86ME(&ET('1H92!C=7)R96YT
M('=I;F1O=RX*("`@($=,6'=I;G-E="AD:7-P;&%Y+"!G;'A?=VEN9&]W*3L*
M"B`@("!Z8G5F9F5R*%12544I.PI]"@H*+R\@5&AI<R!F=6YC=&EO;B!I<R!C
M86QL960@8GD@4&5R9F]R;65R(&5A8V@@9G)A;64@=&\@9')A=R!T:&4@<V-E
M;F4N"@IS=&%T:6,@=F]I9`ID<F%W0VAA;FYE;$-A;&QB86-K*'!F0VAA;FYE
M;"`J(&-H86XL('9O:60@*BD*>PH@("`@<W1A=&EC(&EN="!I;FET(#T@,3L*
M"B`@("!I9B`H:6YI="D*("`@('L*"6EN:70@/2`P.PH*"7!F07!P;'E,36]D
M96PH<&9.97=,36]D96PH,"DI.PH)<&90=7-H261E;G1-871R:7@H*3L*"7!F
M3&EG:'1/;BAP9DYE=TQI9VAT*#`I*3L@+R\@36%K92!A('-I;7!L92!L:6=H
M="!T:&%T(&UO=F5S"@D)"0D@("\O('=I=&@@=&AE('9I97=E<BX*"7!F4&]P
M36%T<FEX*"D["B`@("!]"@H@("`@<&9#;&5A<D-H86XH8VAA;BD["@H@("`@
M:6YT('<@/2!D<F%W7VUO9&5S+3YW<FET93L)+R\@4V5E(&EF(&1R87<@;6]D
M97,@:&%V92!B965N(&-H86YG960N"B`@("!I9B`H=R`A/2!D<F%W7VUO9&5S
M+3YR96%D*0H@("`@>PH@("`@("!I9B`H9')A=U]M;V1E<RT^;6]D97-;34]$
M15]725)%1E)!345=*0H)("!P9D5N86)L92A01D5.7U=)4D5&4D%-12D["B`@
M("`@(&5L<V4*"2`@<&9$:7-A8FQE*%!&14Y?5TE2149204U%*3L*"0H@("`@
M("!I9B`H9')A=U]M;V1E<RT^;6]D97-;34]$15]415A455)%72D*"2`@<&9%
M;F%B;&4H4$9%3E]415A455)%*3L*("`@("`@96QS90H)("!P9D1I<V%B;&4H
M4$9%3E]415A455)%*3L*"B`@("`@(&1R87=?;6]D97,M/G)E860@/2!W.PH@
M("`@?0H*("`@('!F1')A=R@I.PI]"@D*"B\O(%1H:7,@6'0@8V%L;&)A8VL@
M:7,@8V%L;&5D('=H96YE=F5R(%AT(&AA<R!N;R!O=&AE<B!E=F5N=',@=&\*
M+R\@<')O8V5S<RX@($ET(&IU<W0@=&5L;',@<&5R9F]R;65R('1O(&1R87<@
M86YO=&AE<B!F<F%M92X*"G-T871I8R!I;G0*9')A=U]W;W)K<')O8R@I"GL*
M("`@('!F4WEN8R@I.PH@("`@<&9&<F%M92@I.PH*("`@(')E='5R;B!&04Q3
M13L)"2\O(&1O;B=T(')E;6]V92!T:&ES(&-A;&QB86-K"GT*"B\O(%1H:7,@
M8V%L;&)A8VL@9G5C=&EO;B!I<R!C86QL960@:68@<V]M971H:6YG(&AA<'!E
M;G,@=&\@=&AE"B\O($=,6'=I9&=E="P@;&EK92!A;B!E>'!O<V4@;W(@<F5S
M:7IE(&5V96YT+B`@5&AE(&9I<G-T('1I;64@:70@:7,*+R\@8V%L;&5D('=I
M=&@@82!'24Y)5"!E=F5N="X@(%!E<F9O<FUE<B!I<R!T;VQD('1O(&]P96X@
M82!P:7!E(&EN('1H90HO+R!D<F%W('!R;V-E<W,@8GD@=7-I;F<@=&AE(&]P
M96Y'3%AC;VYN96-T:6]N(&-A;&QB86-K+B`@26YF;R!N965D960*+R\@=&\@
M;6%K92!T:&4@1TQ8(&QI;FL@:7,@<&QA8V5D(&EN('-H87)E9"!M96UO<GD@
M:6X@=&AE(&=L>%]I;F9O"B\O('-T<G5C='5R92X@"@IS=&%T:6,@=F]I9"`*
M<F5D<F%W0T(H5VED9V5T('<L('9O:60@*BP@1VQX1')A=T-A;&QB86-K4W1R
M=6-T("H@8V(I"GL*"0D)"2\O(%)E;65M8F5R('1H92!S:7IE(&]F('1H92!W
M:6YD;W<N"B`@("!I9B`H8V(M/G)E87-O;B`]/2!';'A#4E]215-)6D4@?'P@
M8V(M/G)E87-O;B`]/2!';'A#4E]'24Y)5"D*("`@('L*"2IW:6Y?>%]S:7IE
M(#T@8V(M/G=I9'1H.PH)*G=I;E]Y7W-I>F4@/2!C8BT^:&5I9VAT.PH@("`@
M?0H*"0D)"2\O(%1H:7,@:&%P<&5N<R!O;F-E(&%F=&5R('1H92!W:61G970*
M"0D)"2\O(&ES(&9I<G-T(')E86QI>F5D+@H@("`@:68@*&-B+3YR96%S;VX@
M/3T@1VQX0U)?1TE.250I"B`@("!["@E$:7-P;&%Y("H@9&ES<&QA>2`](%AT
M1&ES<&QA>2AW*3L*"5=I;F1O=R`@>%=I;F1O=R`](%AT5VEN9&]W*'<I.PH*
M"0D)"2\O(%!L86-E(&EN9F\@:6X@<VAA<F5D(&UE;6]R>2!S;R!D<F%W"@D)
M"0DO+R!P<F]C97-S(&-A;B!A='1A8VAE9"!T;R!'3%AW:61G970N"@EG;'A?
M:6YF;RT^9&ES<&QA>5]N86UE(#T@,#L*"6=L>%]I;F9O+3YX5VEN9&]W(#T@
M>%=I;F1O=SL*"@D)"0DO+R!296QE87-E(&5X8VQU<VEV92!H;VQD(&]N($=,
M6'=I9&=E="X*"4=,6'5N;&EN:RAD:7-P;&%Y+"!X5VEN9&]W*3L*"@D)"0DO
M+R!097)F;W)M97(@=VEL;"!N;W<@8V%L;`H)"0D)+R\@;W!E;D=,6&-O;FYE
M8W1I;VX@:6X@=&AE(&1R87<*"0D)"2\O('!R;V-E<W,N"@EP9DEN:710:7!E
M*'1H95!I<&4L("AV;VED("@J*2AP9E!I<&4J*2EO<&5N1TQ88V]N;F5C=&EO
M;BD["B`@("!]"GT*"@HO+R!4:&ES(%AT(&-A;&QB86-K(&ES(&-A;&QE9"!W
M:&5N('1H92!A<'!L:6-A=&EO;B!S:&5L;"!W:61G970@:7,*+R\@<W1O=V5D
M(&]R('5N<W1O=V5D+B`@5VAE;B!U;G-T;W=E9"!O<B!O<&5N960@9F]R('1H
M92!F:7)S="!T:6UE+`HO+R!A('=O<FL@<')O8V5S<R!C86QL8F%C:R!I<R!S
M970N("!4:&ES('=O<FL@<')O8V5S<R!I<R!C86QL960*+R\@=VAE;F5V97(@
M6'0@:7,@;F]T('!R;V-E<W-I;F<@;W1H97(@979E;G1S+B`@5VAE;B!T:&4@
M<VAE;&P@=VED9V5T"B\O(&ES('-T;W=E9"P@=&AE('=O<FL@<')O8V5S<R!I
M<R!U;G-E="!S;R!T:&4@87!P;&EC871I;VX@9&]E<R!N;W0*+R\@8VAE=R!U
M<"!#4%4@=&EM92!W:&EL92!I8V]N:69I960N"@IS=&%T:6,@=F]I9`IM87!#
M0BA7:61G970L('9O:60@*BP@6$5V96YT("H@979E;G0I"GL*("`@('-T871I
M8R!8=%=O<FM0<F]C260@=V]R:U]I9#L*("`@('-T871I8R!P:61?="!D<F%W
M7W!I9#L)+R\@9')A=R!P<F]C97-S($E$+@H*"0D)"2\O(%AT(&-A;&QS(&1R
M87=?=V]R:W!R;V,H*0H)"0D)+R\@=VAE;B!N;R!E=F5N=',@87)E('!E;F1I
M;F<N"B`@("!I9B`H979E;G0M/G1Y<&4@/3T@36%P3F]T:69Y*0H@("`@>PH)
M=V]R:U]I9"`](%AT07!P061D5V]R:U!R;V,H87!P7V-O;G1E>'0L("A8=%=O
M<FM0<F]C*61R87=?=V]R:W!R;V,L(#`I.PH*"0D)"2\O(%)E<W5M92!T:&4@
M<W1O<'!E9"!D<F%W('!R;V-E<W,*"0D)"2\O("AS964@8F5L;W<I+@H):68@
M*&1R87=?<&ED(#X@,"D*"2`@("!K:6QL*&1R87=?<&ED+"!324=#3TY4*3L*
M"0D)"2\O($=E="!T:&4@9')A=R!P<F]C97-S97,@240N("!)9@H)"0D)+R\@
M=&AE<F4@:7,@;F\@9')A=R!P<F]C97-S+"!D;VXG=`H)"0D)+R\@=V]R<GD@
M86)O=70@<W5S<&5N9&EN9R!I="X*"65L<V4@:68@*&1R87=?<&ED(#T](#`I
M"@E["@D@("`@;&]N9R!M;V1E(#T@<&9'971-=6QT:7!R;V-E<W,H*3L*"2`@
M("`*"2`@("!I9B`H;6]D92`F(%!&35!?1D]22U]$4D%7*0H)"61R87=?<&ED
M(#T@<&9'9710240H,"P@4$904D]#7T1205<I.PH)("`@(&5L<V4*"0ED<F%W
M7W!I9"`]("TQ.PH)?0H@("`@?0H)"@D)"0DO+R!.;W1H:6YG(&ES(&1O;F4@
M=VAE;B!T:&4*"0D)"2\O(&%P<&QI8V%T:6]N(&ES(&EC;VYI9FEE9"X*("`@
M(&EF("AE=F5N="T^='EP92`]/2!5;FUA<$YO=&EF>2D*("`@('L*"5AT4F5M
M;W9E5V]R:U!R;V,H=V]R:U]I9"D["@H)"0D)+R\@268@=&AE<F4@:7,@82!S
M97!A<F%T92!D<F%W"@D)"0DO+R!P<F]C97-S+"!I="!M=7-T(&)E('1E;7!O
M<F%R:6QY"@D)"0DO+R!S=&]P<&5D+"!O=&AE<G=I<V4@:70@8G5S>2UW86ET
M<RX*"6EF("AD<F%W7W!I9"`^(#`I"@D@("`@:VEL;"AD<F%W7W!I9"P@4TE'
M4U1/4"D["B`@("!]"GT*"@HO+R!4:&ES(%AT(&-A;&QB86-K(&ES(&-A;&QE
M9"!W:&5N(&UO=7-E(&)U='1O;G,@87)E('!R97-S960@:6X@=&AE"B\O($=,
M6'=I9&=E="X*"G-T871I8R!V;VED(`IB=71T;VY#0BA7:61G970L('9O:60@
M*BP@6$5V96YT("H@979E;G0I"GL*("`@(&UO=7-E7WA?<&]S(#T@979E;G0M
M/GAB=71T;VXN>#L*("`@(&UO=7-E7WE?<&]S(#T@979E;G0M/GAB=71T;VXN
M>3L*?0H*+R\@5&AI<R!F=6YC=&EO;B!R96-O;7!U=&5S('1H92!C:&%N;F5L
M<R!V:65W:6YG('!A<F%M971E<G,N"@IS=&%T:6,@=F]I9`IA9&IU<W1?=FEE
M=R@I"GL*("`@('!F5F5C,R!V:65W7W!O<RP@=FEE=U]D:7(["@H@("`@9FQO
M870@87II;5]S:6XL(&%Z:6U?8V]S.PH@("`@9FQO870@:6YC;%]S:6XL(&EN
M8VQ?8V]S.PH@("`@<&93:6Y#;W,H=FEE=U]A>FEM+"`F87II;5]S:6XL("9A
M>FEM7V-O<RD["B`@("!P9E-I;D-O<RAV:65W7VEN8VPL("9I;F-L7W-I;BP@
M)FEN8VQ?8V]S*3L*"B`@("!V:65W7W!O<ULP72`]('9I97=?8V5N=&5R6S!=
M("L@9&ES=&%N8V4@*B!A>FEM7W-I;B`J(&EN8VQ?8V]S.PH@("`@=FEE=U]P
M;W-;,5T@/2!V:65W7V-E;G1E<ELQ72`K(&1I<W1A;F-E("H@*"UA>FEM7V-O
M<RD@*B!I;F-L7V-O<SL*("`@('9I97=?<&]S6S)=(#T@=FEE=U]C96YT97);
M,ET@*R!D:7-T86YC92`J("@M:6YC;%]S:6XI.PH*("`@('9I97=?9&ER6S!=
M(#T@=FEE=U]A>FEM.PH@("`@=FEE=U]D:7);,5T@/2!V:65W7VEN8VP["B`@
M("!V:65W7V1I<ELR72`](#`["@H@("`@<&9#:&%N5FEE=RAT:&5#:&%N;F5L
M+"!V:65W7W!O<RP@=FEE=U]D:7(I.PI]"@H*+R\@5&AI<R!8="!C86QL8F%C
M:R!I<R!C86QL960@=VAE;B!M;W5S92!B=71T;VYS(&%R92!P<F5S<V5D(&%N
M9"!T:&4*+R\@;6]U<V4@:7,@9')A9V=E9"!I;B!T:&4@1TQ8=VED9V5T+B`@
M270@<F5C;VUP=71E<R!T:&4@=FEE=VEN9PHO+R!D:7)E8W1I;VX@86YD(&1I
M<W1A;F-E(&9R;VT@=&AE(&]B:F5C="X*"G-T871I8R!V;VED"FUO=&EO;D-"
M*%=I9&=E="P@=F]I9"`J+"!8179E;G0@*B!E=F5N="D*>PH@("`@:6YT(&YE
M=U]X(#T@979E;G0M/GAM;W1I;VXN>#L*("`@(&EN="!N97=?>2`](&5V96YT
M+3YX;6]T:6]N+GD["@H@("`@9FQO870@9'@@/2`H9FQO870I*&YE=U]X("T@
M;6]U<V5?>%]P;W,I.PH@("`@9FQO870@9'D@/2`H9FQO870I*&YE=U]Y("T@
M;6]U<V5?>5]P;W,I.PH*("`@(&UO=7-E7WA?<&]S(#T@;F5W7W@["B`@("!M
M;W5S95]Y7W!O<R`](&YE=U]Y.PH*"0D)"2\O($UO=F4@=&AE('9I97=E<B!N
M96%R97(@;W(@9F%R=&AE<@H)"0D)+R\@87=A>2X*("`@(&EF("A"=71T;VXQ
M36%S:R`F(&5V96YT+3YX;6]T:6]N+G-T871E*0H@("`@>PH)9&ES=&%N8V4@
M*ST@+2AF86)S*&1I<W1A;F-E*2`K(#`N,#`Q*2`J("AD>2`O(#$P,"XP*3L*
M("`@('T*"@D)"0DO+R!2;W1A=&4@=&AE('9I97=E<B!A<F]U;F0@=&AE"@D)
M"0DO+R!O8FIE8W0N"B`@("!I9B`H0G5T=&]N,DUA<VL@)B!E=F5N="T^>&UO
M=&EO;BYS=&%T92D*("`@('L*"79I97=?87II;2`M/2!D>"`O(#(N,#L*"79I
M97=?:6YC;"`M/2!D>2`O(#(N,#L*("`@('T*"@D)"0DO+R!4<F%N<VQA=&4@
M=&AE('9I97=E<BX*("`@(&EF("A"=71T;VXS36%S:R`F(&5V96YT+3YX;6]T
M:6]N+G-T871E*0H@("`@>PH)9FQO870@9F]V7W@L(&9O=E]Y.PH)<&9'971#
M:&%N1D]6*'1H94-H86YN96PL("9F;W9?>"P@)F9O=E]Y*3L*"@EF;&]A="!A
M>FEM7W-I;BP@87II;5]C;W,["@EF;&]A="!I;F-L7W-I;BP@:6YC;%]C;W,[
M"@EP9E-I;D-O<RAV:65W7V%Z:6TL("9A>FEM7W-I;BP@)F%Z:6U?8V]S*3L*
M"7!F4VEN0V]S*'9I97=?:6YC;"P@)FEN8VQ?<VEN+"`F:6YC;%]C;W,I.PH*
M"69L;V%T('A?9G5D9V4L('E?9G5D9V4L(&IU;FL["@EP9E-I;D-O<RAF;W9?
M>"P@)GA?9G5D9V4L("9J=6YK*3L*"7!F4VEN0V]S*&9O=E]Y+"`F>5]F=61G
M92P@)FIU;FLI.PH)>%]F=61G92`O/2`J=VEN7WA?<VEZ93L*"7E?9G5D9V4@
M+ST@*G=I;E]Y7W-I>F4["@H)=FEE=U]C96YT97);,%T@+3T*"2`@("`H87II
M;5]C;W,@*B!D>"`J('A?9G5D9V4@*R!A>FEM7W-I;B`J("@M:6YC;%]S:6XI
M("H@9'D@*B!Y7V9U9&=E*0H)"2H@9&ES=&%N8V4["@EV:65W7V-E;G1E<ELQ
M72`M/0H)("`@("AA>FEM7W-I;B`J(&1X("H@>%]F=61G92`K(&%Z:6U?8V]S
M("H@:6YC;%]S:6X@*B!D>2`J('E?9G5D9V4I"@D)*B!D:7-T86YC93L*"79I
M97=?8V5N=&5R6S)=("T]"@D@("`@*"UI;F-L7V-O<RD@*B!D>2`J(&1I<W1A
M;F-E("H@>5]F=61G93L*("`@('T*"B`@("!A9&IU<W1?=FEE=R@I.PI]"@H*
M=F]I9`IM86EN*&EN="!A<F=C+"!C:&%R("HJ(&%R9W8I"GL*("`@($%P<$1A
M=&$@87!P1&%T83L*("`@($%R9R!A<F=S6S(P73L*("`@(&EN="!N(#T@,#L*
M"@D)"0DO+R!5<V4@<V-H96UE<R!T;R!A=F]I9"!T:&4@36]T:68*"0D)"2\O
M(&)A8GDM8FQU92!L;V]K+B`*("`@('-T871I8R!3=')I;F<@87!P7V1E9F%U
M;'1S6UT@/2!["@DB*G5S95-C:&5M97,Z(&%L;"(L"@E.54Q,+`H@("`@?3L*
M("`@(%=I9&=E="!T;W!L979E;#L*("`@('1O<&QE=F5L(#T@6'1684%P<$EN
M:71I86QI>F4H)B!A<'!?8V]N=&5X="P@(E!F36]T:68B+`H)"0D)(&]P=&EO
M;G,L(%AT3G5M8F5R*&]P=&EO;G,I+`H)"0D)("9A<F=C+"!A<F=V+`H)"0D)
M(&%P<%]D969A=6QT<RP*"0D)"2!.54Q,*3L*("`@(%AT061D179E;G1(86YD
M;&5R*'1O<&QE=F5L+"!3=')U8W1U<F5.;W1I9GE-87-K+"!&04Q312P*"0D@
M("`@("`H6'1%=F5N=$AA;F1L97(I;6%P0T(L(#`I.PH*("`@(%AT1V5T07!P
M;&EC871I;VY297-O=7)C97,H=&]P;&5V96PL("9A<'!$871A+`H)"0D@("`@
M("!R97-O=7)C97,L(%AT3G5M8F5R*')E<V]U<F-E<RDL"@D)"2`@("`@($Y5
M3$PL(#`I.PH*("`@(&EF("AA<F=C("$](#(I"B`@("!["@EF<')I;G1F*'-T
M9&5R<BP@(E5S86=E.B`@)7,@6RUM<"`\;75L=&EP<F]C97-S(&UO9&4^72!F
M;&EG:'1?9FEL95QN(BP*"0EA<F=V6S!=*3L*"65X:70H,2D["B`@("!]"@H@
M("`@<&9);FET*"D["B`@("!P9DYO=&EF>4QE=F5L*%!&3D997U=!4DXI.PH@
M("`@=F]I9"`J(&%R96YA(#T@<&9'9713:&%R961!<F5N82@I.PH*"0D)"2\O
M(%!L86-E('=I;F1O=R!S:7IE(&EN('-H87)E9"!M96UO<GD*"0D)"2\O('-O
M('1H92!D<F%W('!R;V-E<W,@:&%S(&%C8V5S<R!T;PH)"0D)+R\@:70N(`H@
M("`@=VEN7WA?<VEZ92`]("AI;G0@*BEP9DUA;&QO8RAS:7IE;V8H:6YT*2P@
M87)E;F$I.PH@("`@=VEN7WE?<VEZ92`]("AI;G0@*BEP9DUA;&QO8RAS:7IE
M;V8H:6YT*2P@87)E;F$I.PH*"0D)"2\O($-O;6UU;FEC871E('1H97-E(&1R
M87<@;6]D97,@=&AR;W5G:`H)"0D)+R\@<VAA<F5D(&UE;6]R>2!A<R!W96QL
M+@H@("`@9VQX7VEN9F\@/2`H9VQX7VEN9F]?<W1R=6-T("HI<&9-86QL;V,H
M<VEZ96]F*&=L>%]I;F9O7W-T<G5C="DL(&%R96YA*3L*("`@(&1R87=?;6]D
M97,@/2`H9')A=U]M;V1E7W-T<G5C="`J*7!F36%L;&]C*'-I>F5O9BAD<F%W
M7VUO9&5?<W1R=6-T*2P@87)E;F$I.PH@("`@9')A=U]M;V1E<RT^;6]D97-;
M34]$15]415A455)%72`](#$["B`@("!D<F%W7VUO9&5S+3YM;V1E<UM-3T1%
M7U=)4D5&4D%-15T@/2`P.PH@("`@9')A=U]M;V1E<RT^<F5A9"`](#`["B`@
M("!D<F%W7VUO9&5S+3YW<FET92`](#`["@H)"0D)+R\@4&5R9F]R;65R(&9O
M<FMS(&1R87<@86YD(&-U;&P*"0D)"2\O('!R;V-E<W-E<R!H97)E("AD97!E
M;F1I;F<@;VX*"0D)"2\O(&UP7VUO9&4I+@H@("`@:68@*&%P<$1A=&$N;7!?
M;6]D92`^/2`P*0H)<&9-=6QT:7!R;V-E<W,H87!P1&%T82YM<%]M;V1E*3L*
M("`@('!F0V]N9FEG*"D["@H)"0D)+R\@3&]A9"!S;VUE(&UO9&5L('1O('-P
M:6X@87)O=6YD+@H@("`@8VAA<B`J('!A=&@@/2!D:7)N86UE*'-T<F1U<"AA
M<F=V6S%=*2D["B`@("!P9D9I;&50871H*'!A=&@I.PH@("`@<&9'<F]U<"`J
M(&1A=&$@/2!,;V%D1FQT*&%R9W9;,5TI.PH@("`@:68@*&1A=&$@/3T@,"D*
M("`@('L*"69P<FEN=&8H<W1D97)R+"`B)7,Z("`E<R!I<R!N;W0@<F5A9&%B
M;&5<;B(L(&%R9W9;,%TL(&%R9W9;,5TI.PH)97AI="@Q*3L*("`@('T*"B`@
M("!7:61G970@9F]R;2`](%AT0W)E871E36%N86=E9%=I9&=E="@B9F]R;2(L
M('AM1F]R;5=I9&=E=$-L87-S+"!T;W!L979E;"P*"0D)"0E.54Q,+"`P*3L*
M("`@(`H@("`@;B`](#`["B`@("!8=%-E=$%R9RAA<F=S6VY=+"!8;4YO<FEE
M;G1A=&EO;BP@6&U615)424-!3"D[("!N*RL["B`@("!7:61G970@<F]W8V]L
M(#T@6'1#<F5A=&5-86YA9V5D5VED9V5T*")C;VUM86YD<R(L"@D)"0D)("!X
M;5)O=T-O;'5M;E=I9&=E=$-L87-S+"!F;W)M+`H)"0D)"2`@87)G<RP@;BD[
M"B`@("!N(#T@,#L*("`@(%AT4V5T07)G*&%R9W-;;ETL(%AM3G1O<$%T=&%C
M:&UE;G0L"2`@("!8;4%45$%#2%]&3U)-*3L@;BLK.PH@("`@6'13971!<F<H
M87)G<UMN72P@6&U.;&5F=$%T=&%C:&UE;G0L("`@(%AM051404-(7T9/4DTI
M.R!N*RL["B`@("!8=%-E=%9A;'5E<RAR;W=C;VPL(&%R9W,L(&XI.PH*"0D)
M"2\O($-R96%T92!T:&4@1TQ8=VED9V5T(&9O<B!'3`H)"0D)+R\@<F5N9&5R
M:6YG+@H@("`@;B`](#`["B`@("!8=%-E=$%R9RAA<F=S6VY=+"!';'A.9VQX
M0V]N9FEG+"!R96=U;&%R1VQX0V]N9FEG*3L@;BLK.PH@("`@6'13971!<F<H
M87)G<UMN72P@6'1.=VED=&@L(#8T-BD[(&XK*SL*("`@(%AT4V5T07)G*&%R
M9W-;;ETL(%AT3FAE:6=H="P@-#@V*3L@;BLK.PH@("`@6'13971!<F<H87)G
M<UMN72P@6&U.;&5F=$%T=&%C:&UE;G0L("`@(%AM051404-(7U=)1$=%5"D[
M(&XK*SL*("`@(%AT4V5T07)G*&%R9W-;;ETL(%AM3FQE9G17:61G970L"2`@
M("!R;W=C;VPI.R!N*RL["B`@("!8=%-E=$%R9RAA<F=S6VY=+"!8;4YT;W!!
M='1A8VAM96YT+"`@("`@6&U!5%1!0TA?1D]232D[(&XK*SL*("`@(%AT4V5T
M07)G*&%R9W-;;ETL(%AM3G)I9VAT071T86-H;65N="P@("!8;4%45$%#2%]&
M3U)-*3L@;BLK.PH@("`@6'13971!<F<H87)G<UMN72P@6&U.8F]T=&]M071T
M86-H;65N="P@(%AM051404-(7T9/4DTI.R!N*RL["B`@("!7:61G970@1TQ8
M=VED9V5T(#T@6'1#<F5A=&5-86YA9V5D5VED9V5T*")D<F%W7V%R96$B+`H)
M"0D)("`@("`@9VQX341R87=7:61G971#;&%S<RP*"0D)"2`@("`@(&9O<FTL
M(&%R9W,L(&XI.PH@("`@6'1!9&1#86QL8F%C:RA'3%AW:61G970L($=L>$YG
M:6YI=$-A;&QB86-K+`H)"2`@*%AT0V%L;&)A8VM0<F]C*7)E9')A=T-"+"`P
M*3L*("`@(%AT061D0V%L;&)A8VLH1TQ8=VED9V5T+"!';'A.97AP;W-E0V%L
M;&)A8VLL"@D)("`H6'1#86QL8F%C:U!R;V,I<F5D<F%W0T(L(#`I.PH@("`@
M6'1!9&1#86QL8F%C:RA'3%AW:61G970L($=L>$YR97-I>F5#86QL8F%C:RP*
M"0D@("A8=$-A;&QB86-K4')O8RER961R87=#0BP@,"D["B`@("!8=$%D9$5V
M96YT2&%N9&QE<BA'3%AW:61G970L($)U='1O;DUO=&EO;DUA<VLL($9!3%-%
M+`H)"2`@("`@("A8=$5V96YT2&%N9&QE<BEM;W1I;VY#0BP@,"D["B`@("!8
M=$%D9$5V96YT2&%N9&QE<BA'3%AW:61G970L($)U='1O;E!R97-S36%S:RP@
M1D%,4T4L"@D)("`@("`@*%AT179E;G1(86YD;&5R*6)U='1O;D-"+"`P*3L*
M"B`@("!7:61G970@;6]D95=I9&=E=#L*"B`@("!N(#T@,#L*("`@(%AT4V5T
M07)G*&%R9W-;;ETL(%AM3G-E="P@5%)512D[(&XK*SL*("`@(&UO9&57:61G
M970@/2!8=$-R96%T94UA;F%G9617:61G970H(E1E>'1U<F4B+"!X;51O9V=L
M94)U='1O;E=I9&=E=$-L87-S+"`*"0D)"2`@("`@("!R;W=C;VPL(&%R9W,L
M(&XI.PH@("`@6'1!9&1#86QL8F%C:RAM;V1E5VED9V5T+"!8;4YV86QU94-H
M86YG961#86QL8F%C:RP*"0D@("A8=$-A;&QB86-K4')O8REM;V1E0T(L("A8
M=%!O:6YT97(I34]$15]415A455)%*3L*"B`@("!M;V1E5VED9V5T(#T@6'1#
M<F5A=&5-86YA9V5D5VED9V5T*")7:7)E9G)A;64B+"!X;51O9V=L94)U='1O
M;E=I9&=E=$-L87-S+"`*"0D)"2`@("`@("!R;W=C;VPL($Y53$PL(#`I.PH@
M("`@6'1!9&1#86QL8F%C:RAM;V1E5VED9V5T+"!8;4YV86QU94-H86YG961#
M86QL8F%C:RP*"0D@("A8=$-A;&QB86-K4')O8REM;V1E0T(L("A8=%!O:6YT
M97(I34]$15]725)%1E)!344I.PH*("`@(%AT4F5A;&EZ95=I9&=E="AT;W!L
M979E;"D["@H@("`@=&AE4&EP92`]('!F1V5T4&EP92@P*3L*("`@('1H94-H
M86YN96P@/2!P9DYE=T-H86XH=&AE4&EP92D["B`@("!P9E-C96YE("H@<V-E
M;F4@/2!P9DYE=U-C96YE*"D["B`@("!P9D-H86Y38V5N92AT:&5#:&%N;F5L
M+"!S8V5N92D["B`@("!P9D-H86Y$<F%W1G5N8RAT:&5#:&%N;F5L+"!D<F%W
M0VAA;FYE;$-A;&QB86-K*3L*"B`@("!P9D)O>"!B;W5N9#L*("`@('!F1V5T
M3F]D94)";W@H9&%T82P@)B!B;W5N9"P@,"D["B`@("!P9E9E8S,@<VEZ93L*
M("`@('!F0V]M8FEN959E8S,H=FEE=U]C96YT97(L(#`N-2P@8F]U;F0N;6EN
M+"`P+C4L(&)O=6YD+FUA>"D["B`@("!P9E-U8E9E8S,H<VEZ92P@8F]U;F0N
M;6%X+"!B;W5N9"YM:6XI.PH@("`@9&EA;65T97(@/2!01E]-05@R*%!&7TU!
M6#(H<VEZ95LP72P@<VEZ95LQ72DL('-I>F5;,ETI.PH@("`@9&ES=&%N8V4@
M/2!D:6%M971E<B`O("@R("H@9G-I;B@T-2XP("\@,B`J($U?4$D@+R`Q.#`I
M*3L*"B`@("!P9D-H86Y.96%R1F%R*'1H94-H86YN96PL(&1I86UE=&5R("\@
M,3`N,"P@9&EA;65T97(@*B`Q,#`I.PH@("`@<&9!9&1#:&EL9"AS8V5N92P@
M9&%T82D["@H@("`@861J=7-T7W9I97<H*3L*"B`@("!8=$%P<$UA:6Y,;V]P
M*&%P<%]C;VYT97AT*3L*?0H*"B\O(%!E<F9O<FUE<B!C86QL<R!T:&5S92!'
M3"!R;W5T:6YE<R!E=F5R>2!F<F%M92X@(%1H97D@87)E('9E<GD@<VQO=PHO
M+R!B96-A=7-E('1H97D@<F5Q=6ER92!A(')O=6YD('1R:7`@=&\@=&AE(%@@
M<V5R=F5R+B`@5&AE<V4@87)E(&UU8V@*+R\@9F%S=&5R(')E<&QA8V5M96YT
M<RX*"F5X=&5R;B`B0R(@=F]I9"`*9V5T;W)I9VEN*&QO;F<@*B!X+"!L;VYG
M("H@>2D*>PH@("`@*G@@/2`P.PH@("`@*GD@/2`P.PI]"@IE>'1E<FX@(D,B
M('9O:60*9V5T<VEZ92AL;VYG("H@>"P@;&]N9R`J('DI"GL*("`@("IX(#T@
M*G=I;E]X7W-I>F4["B`@("`J>2`]("IW:6Y?>5]S:7IE.PI]"FEN*#0U+C`@
M+R`R("H@35]022`O(#$X,"DI.PH*("`@('!F0VAA;DYE87)&87(H=&AE0VAA
M;FYE;"P@9&EA;65T97(@+R`Q,"XP+"!D:6%M971E<B`J(#$P,"D["B`@("!P
M9D%D9$-H:6QD*'-C96YE+"!D871A*3L*"B`@("!A9&IU<W1?=FEE=R@I.PH`
M````````````````````````````````````````````````````````````
M````````````````````````````````````````````````````````````
M````````````````````````````````````````````````````````````
M````````````````````````````````````````````````````````````
M````````````````````````````````````````````````````````````
M````````````````````````````````````````````````````````````
M````````````````````````````````````````````````````````````
M````````````````````````````````````````````````````````````
M````````````````````````````````````````````````````````````
M````````````````````````````````````````````````````````````
M````````````````````````````````````````````````````````````
M````````````````````````````````````````````````````````````
M````````````````````````````````````````````````````````````
M````````````````````````````````````````````````````````````
M````````````````````````````````````````````````````````````
M````````````````````````````````````````````````````````````
M````````````````````````````````````````````````````````````
M````````````````````````````````````````````````````````````
M````````````````````````````````````````````````````````````
M````````````````````````````````````````````````````````````
M````````````````````````````````````````````````````````````
M````````````````````````````````````````````````````````````
M````````````````````````````````````````````````````````````
M````````````````````````````````````````````````````````````
M````````````````````````````````````````````````````````````
M````````````````````````````````````````````````````````````
M````````````````````````````````````````````````````````````
M````````````````````````````````````````````````````````````
M````````````````````````````````````````````````````````````
M````````````````````````````````````````````````````````````
M````````````````````````````````````````````````````````````
M````````````````````````````````````````````````````````````
M````````````````````````````````````````````````````````````
M````````````````````````````````````````````````````````````
%````````
`
end



-- 
-------------------------------------------------------------------------------
Wade Olsen, wade@sgi.com, 415-390-1023, Silicon Graphics Computer Systems


From guest  Sat Apr  9 19:19:42 1994
From: moore@ced.utah.edu (Tim Moore)
Date: Sat, 9 Apr 94 20:19:36 -0600
Message-Id: <9404100219.AA11765@ruin.ced.utah.edu>
To: info-performer@sgi.sgi.com
Subject: Performer and the GlxMDraw widget?
Cc: 
Status: OR

I'm trying to use Performer inside the GlxMDraw Motif widget.  I'm
almost there, but not quite.   Performer doesn't seem to be
double-buffering reliably.  Sometimes there's that annoying flicker,
sometimes not.  I'm using this glxConfig array:

static GLXconfig glxConfig [] = {
  {GLX_NORMAL, GLX_DOUBLE, TRUE},
  {GLX_NORMAL, GLX_RGB, TRUE},
  {GLX_NORMAL, GLX_ZSIZE, 0},
  {GLX_NORMAL, GLX_BUFSIZE, 48},
  {GLX_NORMAL, GLX_MSSAMPLE, 4},
  {GLX_NORMAL, GLX_MSZSIZE, 32},
  {GLX_NORMAL, GLX_MSSSIZE, 1},
  {0, 0, 0}
};

At runtime Performer prints these error message, but it isn't fatal:

ERROR #4  gconfig: not legal for mixed model: ERR_BADWINDOW
ERROR #4  gconfig: not legal for mixed model: ERR_BADWINDOW

Am I doing something wrong, or is this doomed to failure?

Tim





