home *** CD-ROM | disk | FTP | other *** search
/ IRIX Base Documentation 2002 November / SGI IRIX Base Documentation 2002 November.iso / usr / share / catman / g_man / cat3 / OpenGL / glutesscallback.z / glutesscallback
Encoding:
Text File  |  2002-10-03  |  23.3 KB  |  331 lines

  1.  
  2.  
  3.  
  4. gggglllluuuuTTTTeeeessssssssCCCCaaaallllllllbbbbaaaacccckkkk((((3333GGGG))))            OOOOppppeeeennnnGGGGLLLL RRRReeeeffffeeeerrrreeeennnncccceeee            gggglllluuuuTTTTeeeessssssssCCCCaaaallllllllbbbbaaaacccckkkk((((3333GGGG))))
  5.  
  6.  
  7.  
  8. NNNNAAAAMMMMEEEE
  9.      gggglllluuuuTTTTeeeessssssssCCCCaaaallllllllbbbbaaaacccckkkk - define a callback for a tessellation object
  10.  
  11.  
  12. CCCC SSSSPPPPEEEECCCCIIIIFFFFIIIICCCCAAAATTTTIIIIOOOONNNN
  13.      void gggglllluuuuTTTTeeeessssssssCCCCaaaallllllllbbbbaaaacccckkkk( GLUtesselator* _t_e_s_s,
  14.                            GLenum _w_h_i_c_h,
  15.                            GLvoid (*_C_a_l_l_B_a_c_k_F_u_n_c)( )
  16.  
  17.  
  18. PPPPAAAARRRRAAAAMMMMEEEETTTTEEEERRRRSSSS
  19.      _t_e_s_s          Specifies the tessellation object (created with
  20.                    gggglllluuuuNNNNeeeewwwwTTTTeeeessssssss).
  21.  
  22.      _w_h_i_c_h         Specifies the callback being defined. The following values
  23.                    are valid:  GGGGLLLLUUUU____TTTTEEEESSSSSSSS____BBBBEEEEGGGGIIIINNNN, GGGGLLLLUUUU____TTTTEEEESSSSSSSS____BBBBEEEEGGGGIIIINNNN____DDDDAAAATTTTAAAA,
  24.                    GGGGLLLLUUUU____TTTTEEEESSSSSSSS____EEEEDDDDGGGGEEEE____FFFFLLLLAAAAGGGG, GGGGLLLLUUUU____TTTTEEEESSSSSSSS____EEEEDDDDGGGGEEEE____FFFFLLLLAAAAGGGG____DDDDAAAATTTTAAAA,
  25.                    GGGGLLLLUUUU____TTTTEEEESSSSSSSS____VVVVEEEERRRRTTTTEEEEXXXX, GGGGLLLLUUUU____TTTTEEEESSSSSSSS____VVVVEEEERRRRTTTTEEEEXXXX____DDDDAAAATTTTAAAA, GGGGLLLLUUUU____TTTTEEEESSSSSSSS____EEEENNNNDDDD,
  26.                    GGGGLLLLUUUU____TTTTEEEESSSSSSSS____EEEENNNNDDDD____DDDDAAAATTTTAAAA, GGGGLLLLUUUU____TTTTEEEESSSSSSSS____CCCCOOOOMMMMBBBBIIIINNNNEEEE, GGGGLLLLUUUU____TTTTEEEESSSSSSSS____CCCCOOOOMMMMBBBBIIIINNNNEEEE____DDDDAAAATTTTAAAA,
  27.                    GGGGLLLLUUUU____TTTTEEEESSSSSSSS____EEEERRRRRRRROOOORRRR, and GGGGLLLLUUUU____TTTTEEEESSSSSSSS____EEEERRRRRRRROOOORRRR____DDDDAAAATTTTAAAA.
  28.  
  29.      _C_a_l_l_B_a_c_k_F_u_n_c  Specifies the function to be called.
  30.  
  31. DDDDEEEESSSSCCCCRRRRIIIIPPPPTTTTIIIIOOOONNNN
  32.      gggglllluuuuTTTTeeeessssssssCCCCaaaallllllllbbbbaaaacccckkkk is used to indicate a callback to be used by a
  33.      tessellation object.  If the specified callback is already defined, then
  34.      it is replaced. If _C_a_l_l_B_a_c_k_F_u_n_c is NULL, then the existing callback
  35.      becomes undefined.
  36.  
  37.      These callbacks are used by the tessellation object to describe how a
  38.      polygon specified by the user is broken into triangles. Note that there
  39.      are two versions of each callback: one with user-specified polygon data
  40.      and one without. If both versions of a particular callback are specified,
  41.      then the callback with user-specified polygon data will be used. Note
  42.      that the _p_o_l_y_g_o_n__d_a_t_a parameter used by some of the functions is a copy
  43.      of the pointer that was specified when gggglllluuuuTTTTeeeessssssssBBBBeeeeggggiiiinnnnPPPPoooollllyyyyggggoooonnnn was called.
  44.      The legal callbacks are as follows:
  45.  
  46.      GGGGLLLLUUUU____TTTTEEEESSSSSSSS____BBBBEEEEGGGGIIIINNNN
  47.                The begin callback is invoked like ggggllllBBBBeeeeggggiiiinnnn to indicate the
  48.                start of a (triangle) primitive. The function takes a single
  49.                argument of type GLenum. If the GGGGLLLLUUUU____TTTTEEEESSSSSSSS____BBBBOOOOUUUUNNNNDDDDAAAARRRRYYYY____OOOONNNNLLLLYYYY property
  50.                is set to GGGGLLLL____FFFFAAAALLLLSSSSEEEE, then the argument is set to either
  51.                GGGGLLLL____TTTTRRRRIIIIAAAANNNNGGGGLLLLEEEE____FFFFAAAANNNN, GGGGLLLL____TTTTRRRRIIIIAAAANNNNGGGGLLLLEEEE____SSSSTTTTRRRRIIIIPPPP, or GGGGLLLL____TTTTRRRRIIIIAAAANNNNGGGGLLLLEEEESSSS. If the
  52.                GGGGLLLLUUUU____TTTTEEEESSSSSSSS____BBBBOOOOUUUUNNNNDDDDAAAARRRRYYYY____OOOONNNNLLLLYYYY property is set to GGGGLLLL____TTTTRRRRUUUUEEEE, then the
  53.                argument will be set to GGGGLLLL____LLLLIIIINNNNEEEE____LLLLOOOOOOOOPPPP. The function prototype
  54.                for this callback is:
  55.  
  56.                     void begin ( GLenum type );
  57.  
  58.  
  59.  
  60.  
  61.  
  62.  
  63.                                                                         PPPPaaaaggggeeee 1111
  64.  
  65.  
  66.  
  67.  
  68.  
  69.  
  70. gggglllluuuuTTTTeeeessssssssCCCCaaaallllllllbbbbaaaacccckkkk((((3333GGGG))))            OOOOppppeeeennnnGGGGLLLL RRRReeeeffffeeeerrrreeeennnncccceeee            gggglllluuuuTTTTeeeessssssssCCCCaaaallllllllbbbbaaaacccckkkk((((3333GGGG))))
  71.  
  72.  
  73.  
  74.      GGGGLLLLUUUU____TTTTEEEESSSSSSSS____BBBBEEEEGGGGIIIINNNN____DDDDAAAATTTTAAAA
  75.                The same as the GGGGLLLLUUUU____TTTTEEEESSSSSSSS____BBBBEEEEGGGGIIIINNNN callback except that it takes an
  76.                additional pointer argument. This pointer is identical to the
  77.                opaque pointer provided when gggglllluuuuTTTTeeeessssssssBBBBeeeeggggiiiinnnnPPPPoooollllyyyyggggoooonnnn was called.
  78.                The function prototype for this callback is:
  79.  
  80.                     void beginData ( GLenum type, void *polygon_data );
  81.  
  82.  
  83.      GGGGLLLLUUUU____TTTTEEEESSSSSSSS____EEEEDDDDGGGGEEEE____FFFFLLLLAAAAGGGG
  84.                The edge flag callback is similar to ggggllllEEEEddddggggeeeeFFFFllllaaaagggg. The function
  85.                takes a single boolean flag that indicates which edges lie on
  86.                the polygon boundary. If the flag is GGGGLLLL____TTTTRRRRUUUUEEEE, then each vertex
  87.                that follows begins an edge that lies on the polygon boundary,
  88.                that is, an edge that separates an interior region from an
  89.                exterior one.  If the flag is GGGGLLLL____FFFFAAAALLLLSSSSEEEE, then each vertex that
  90.                follows begins an edge that lies in the polygon interior. The
  91.                edge flag callback (if defined) is invoked before the first
  92.                vertex callback.
  93.  
  94.                Since triangle fans and triangle strips do not support edge
  95.                flags, the begin callback is not called with GGGGLLLL____TTTTRRRRIIIIAAAANNNNGGGGLLLLEEEE____FFFFAAAANNNN or
  96.                GGGGLLLL____TTTTRRRRIIIIAAAANNNNGGGGLLLLEEEE____SSSSTTTTRRRRIIIIPPPP if a non-NULL edge flag callback is provided.
  97.                (If the callback is initialized to NULL, there is no impact on
  98.                performance). Instead, the fans and strips are converted to
  99.                independent triangles. The function prototype for this callback
  100.                is:
  101.  
  102.                     void edgeFlag ( GLboolean flag );
  103.  
  104.  
  105.      GGGGLLLLUUUU____TTTTEEEESSSSSSSS____EEEEDDDDGGGGEEEE____FFFFLLLLAAAAGGGG____DDDDAAAATTTTAAAA
  106.                The same as the GGGGLLLLUUUU____TTTTEEEESSSSSSSS____EEEEDDDDGGGGEEEE____FFFFLLLLAAAAGGGG callback except that it
  107.                takes an additional pointer argument. This pointer is identical
  108.                to the opaque pointer provided when gggglllluuuuTTTTeeeessssssssBBBBeeeeggggiiiinnnnPPPPoooollllyyyyggggoooonnnn was
  109.                called. The function prototype for this callback is:
  110.  
  111.                     void edgeFlagData ( GLboolean flag, void *polygon_data );
  112.  
  113.  
  114.      GGGGLLLLUUUU____TTTTEEEESSSSSSSS____VVVVEEEERRRRTTTTEEEEXXXX
  115.                The vertex callback is invoked between the begin and end
  116.                callbacks.  It is similar to ggggllllVVVVeeeerrrrtttteeeexxxx, and it defines the
  117.                vertices of the triangles created by the tessellation process.
  118.                The function takes a pointer as its only argument.  This
  119.                pointer is identical to the opaque pointer provided by the user
  120.                when the vertex was described (see gggglllluuuuTTTTeeeessssssssVVVVeeeerrrrtttteeeexxxx). The function
  121.                prototype for this callback is:
  122.  
  123.                     void vertex ( void *vertex_data );
  124.  
  125.  
  126.  
  127.  
  128.  
  129.                                                                         PPPPaaaaggggeeee 2222
  130.  
  131.  
  132.  
  133.  
  134.  
  135.  
  136. gggglllluuuuTTTTeeeessssssssCCCCaaaallllllllbbbbaaaacccckkkk((((3333GGGG))))            OOOOppppeeeennnnGGGGLLLL RRRReeeeffffeeeerrrreeeennnncccceeee            gggglllluuuuTTTTeeeessssssssCCCCaaaallllllllbbbbaaaacccckkkk((((3333GGGG))))
  137.  
  138.  
  139.  
  140.      GGGGLLLLUUUU____TTTTEEEESSSSSSSS____VVVVEEEERRRRTTTTEEEEXXXX____DDDDAAAATTTTAAAA
  141.                The same as the GGGGLLLLUUUU____TTTTEEEESSSSSSSS____VVVVEEEERRRRTTTTEEEEXXXX callback except that it takes
  142.                an additional pointer argument. This pointer is identical to
  143.                the opaque pointer provided when gggglllluuuuTTTTeeeessssssssBBBBeeeeggggiiiinnnnPPPPoooollllyyyyggggoooonnnn was
  144.                called. The function prototype for this callback is:
  145.  
  146.                     void vertexData ( void *vertex_data, void *polygon_data );
  147.  
  148.  
  149.      GGGGLLLLUUUU____TTTTEEEESSSSSSSS____EEEENNNNDDDD
  150.                The end callback serves the same purpose as ggggllllEEEEnnnndddd. It indicates
  151.                the end of a primitive and it takes no arguments. The function
  152.                prototype for this callback is:
  153.  
  154.                     void end ( void );
  155.  
  156.  
  157.      GGGGLLLLUUUU____TTTTEEEESSSSSSSS____EEEENNNNDDDD____DDDDAAAATTTTAAAA
  158.                The same as the GGGGLLLLUUUU____TTTTEEEESSSSSSSS____EEEENNNNDDDD callback except that it takes an
  159.                additional pointer argument. This pointer is identical to the
  160.                opaque pointer provided when gggglllluuuuTTTTeeeessssssssBBBBeeeeggggiiiinnnnPPPPoooollllyyyyggggoooonnnn was called.
  161.                The function prototype for this callback is:
  162.  
  163.                     void endData ( void *polygon_data);
  164.  
  165.  
  166.      GGGGLLLLUUUU____TTTTEEEESSSSSSSS____CCCCOOOOMMMMBBBBIIIINNNNEEEE
  167.                The combine callback is called to create a new vertex when the
  168.                tessellation detects an intersection, or wishes to merge
  169.                features. The function takes four arguments: an array of three
  170.                elements each of type GLdouble, an array of four pointers, an
  171.                array of four elements each of type GLfloat, and a pointer to a
  172.                pointer. The prototype is:
  173.  
  174.                     void combine( GLdouble coords[3], void *vertex_data[4],
  175.                                   GLfloat weight[4], void **outData );
  176.  
  177.  
  178.                The vertex is defined as a linear combination of up to four
  179.                existing vertices, stored in _v_e_r_t_e_x__d_a_t_a. The coefficients of
  180.                the linear combination are given by _w_e_i_g_h_t; these weights
  181.                always add up to 1.  All vertex pointers are valid even when
  182.                some of the weights are 0.  _c_o_o_r_d_s gives the location of the
  183.                new vertex.
  184.  
  185.                The user must allocate another vertex, interpolate parameters
  186.                using _v_e_r_t_e_x__d_a_t_a and _w_e_i_g_h_t, and return the new vertex pointer
  187.                in _o_u_t_D_a_t_a. This handle is supplied during rendering callbacks.
  188.                The user is responsible for freeing the memory some time after
  189.                gggglllluuuuTTTTeeeessssssssEEEEnnnnddddPPPPoooollllyyyyggggoooonnnn is called.
  190.  
  191.  
  192.  
  193.  
  194.  
  195.                                                                         PPPPaaaaggggeeee 3333
  196.  
  197.  
  198.  
  199.  
  200.  
  201.  
  202. gggglllluuuuTTTTeeeessssssssCCCCaaaallllllllbbbbaaaacccckkkk((((3333GGGG))))            OOOOppppeeeennnnGGGGLLLL RRRReeeeffffeeeerrrreeeennnncccceeee            gggglllluuuuTTTTeeeessssssssCCCCaaaallllllllbbbbaaaacccckkkk((((3333GGGG))))
  203.  
  204.  
  205.  
  206.                For example, if the polygon lies in an arbitrary plane in 3-
  207.                space, and a color is associated with each vertex, the
  208.                GGGGLLLLUUUU____TTTTEEEESSSSSSSS____CCCCOOOOMMMMBBBBIIIINNNNEEEE callback might look like this:
  209.  
  210.                     void myCombine( GLdouble coords[3], VERTEX *d[4],
  211.                                     GLfloat w[4], VERTEX **dataOut )
  212.                     {
  213.                        VERTEX *new = new_vertex();
  214.  
  215.                        new->x = coords[0];
  216.                        new->y = coords[1];
  217.                        new->z = coords[2];
  218.                        new->r = w[0]*d[0]->r + w[1]*d[1]->r + w[2]*d[2]->r + w[3]*d[3]->r;
  219.                        new->g = w[0]*d[0]->g + w[1]*d[1]->g + w[2]*d[2]->g + w[3]*d[3]->g;
  220.                        new->b = w[0]*d[0]->b + w[1]*d[1]->b + w[2]*d[2]->b + w[3]*d[3]->b;
  221.                        new->a = w[0]*d[0]->a + w[1]*d[1]->a + w[2]*d[2]->a + w[3]*d[3]->a;
  222.                        *dataOut = new;
  223.                     }
  224.  
  225.  
  226.                If the tessellation detects an intersection, then the
  227.                GGGGLLLLUUUU____TTTTEEEESSSSSSSS____CCCCOOOOMMMMBBBBIIIINNNNEEEE or GGGGLLLLUUUU____TTTTEEEESSSSSSSS____CCCCOOOOMMMMBBBBIIIINNNNEEEE____DDDDAAAATTTTAAAA callback (see below)
  228.                must be defined, and it must write a non-NULL pointer into
  229.                _d_a_t_a_O_u_t. Otherwise the GGGGLLLLUUUU____TTTTEEEESSSSSSSS____NNNNEEEEEEEEDDDD____CCCCOOOOMMMMBBBBIIIINNNNEEEE____CCCCAAAALLLLLLLLBBBBAAAACCCCKKKK error
  230.                occurs, and no output is generated.
  231.  
  232.      GGGGLLLLUUUU____TTTTEEEESSSSSSSS____CCCCOOOOMMMMBBBBIIIINNNNEEEE____DDDDAAAATTTTAAAA
  233.                The same as the GGGGLLLLUUUU____TTTTEEEESSSSSSSS____CCCCOOOOMMMMBBBBIIIINNNNEEEE callback except that it takes
  234.                an additional pointer argument. This pointer is identical to
  235.                the opaque pointer provided when gggglllluuuuTTTTeeeessssssssBBBBeeeeggggiiiinnnnPPPPoooollllyyyyggggoooonnnn was
  236.                called. The function prototype for this callback is:
  237.  
  238.                     void combineData ( GLdouble coords[3], void *vertex_data[4],
  239.                                        GLfloat weight[4], void **outData,
  240.                                        void *polygon_data );
  241.  
  242.  
  243.      GGGGLLLLUUUU____TTTTEEEESSSSSSSS____EEEERRRRRRRROOOORRRR
  244.                The error callback is called when an error is encountered. The
  245.                one argument is of type GLenum; it indicates the specific error
  246.                that occurred and will be set to one of
  247.                GGGGLLLLUUUU____TTTTEEEESSSSSSSS____MMMMIIIISSSSSSSSIIIINNNNGGGG____BBBBEEEEGGGGIIIINNNN____PPPPOOOOLLLLYYYYGGGGOOOONNNN, GGGGLLLLUUUU____TTTTEEEESSSSSSSS____MMMMIIIISSSSSSSSIIIINNNNGGGG____EEEENNNNDDDD____PPPPOOOOLLLLYYYYGGGGOOOONNNN,
  248.                GGGGLLLLUUUU____TTTTEEEESSSSSSSS____MMMMIIIISSSSSSSSIIIINNNNGGGG____BBBBEEEEGGGGIIIINNNN____CCCCOOOONNNNTTTTOOOOUUUURRRR, GGGGLLLLUUUU____TTTTEEEESSSSSSSS____MMMMIIIISSSSSSSSIIIINNNNGGGG____EEEENNNNDDDD____CCCCOOOONNNNTTTTOOOOUUUURRRR,
  249.                GGGGLLLLUUUU____TTTTEEEESSSSSSSS____CCCCOOOOOOOORRRRDDDD____TTTTOOOOOOOO____LLLLAAAARRRRGGGGEEEE, GGGGLLLLUUUU____TTTTEEEESSSSSSSS____NNNNEEEEEEEEDDDD____CCCCOOOOMMMMBBBBIIIINNNNEEEE____CCCCAAAALLLLLLLLBBBBAAAACCCCKKKK or
  250.                GGGGLLLLUUUU____OOOOUUUUTTTT____OOOOFFFF____MMMMEEEEMMMMOOOORRRRYYYY. Character strings describing these errors
  251.                can be retrieved with the gggglllluuuuEEEErrrrrrrroooorrrrSSSSttttrrrriiiinnnngggg call. The function
  252.                prototype for this callback is:
  253.  
  254.                     void error ( GLenum errno );
  255.  
  256.  
  257.  
  258.  
  259.  
  260.  
  261.                                                                         PPPPaaaaggggeeee 4444
  262.  
  263.  
  264.  
  265.  
  266.  
  267.  
  268. gggglllluuuuTTTTeeeessssssssCCCCaaaallllllllbbbbaaaacccckkkk((((3333GGGG))))            OOOOppppeeeennnnGGGGLLLL RRRReeeeffffeeeerrrreeeennnncccceeee            gggglllluuuuTTTTeeeessssssssCCCCaaaallllllllbbbbaaaacccckkkk((((3333GGGG))))
  269.  
  270.  
  271.  
  272.                The GLU library will recover from the first four errors by
  273.                inserting the missing call(s).  GGGGLLLLUUUU____TTTTEEEESSSSSSSS____CCCCOOOOOOOORRRRDDDD____TTTTOOOOOOOO____LLLLAAAARRRRGGGGEEEE
  274.                indicates that some vertex coordinate exceeded the predefined
  275.                constant GGGGLLLLUUUU____TTTTEEEESSSSSSSS____MMMMAAAAXXXX____CCCCOOOOOOOORRRRDDDD in absolute value, and that the
  276.                value has been clamped. (Coordinate values must be small enough
  277.                so that two can be multiplied together without overflow.)
  278.                GGGGLLLLUUUU____TTTTEEEESSSSSSSS____NNNNEEEEEEEEDDDD____CCCCOOOOMMMMBBBBIIIINNNNEEEE____CCCCAAAALLLLLLLLBBBBAAAACCCCKKKK indicates that the tessellation
  279.                detected an intersection between two edges in the input data,
  280.                and the GGGGLLLLUUUU____TTTTEEEESSSSSSSS____CCCCOOOOMMMMBBBBIIIINNNNEEEE or GGGGLLLLUUUU____TTTTEEEESSSSSSSS____CCCCOOOOMMMMBBBBIIIINNNNEEEE____DDDDAAAATTTTAAAA callback was
  281.                not provided. No output is generated. GGGGLLLLUUUU____OOOOUUUUTTTT____OOOOFFFF____MMMMEEEEMMMMOOOORRRRYYYY
  282.                indicates that there is not enough memory so no output is
  283.                generated.
  284.  
  285.      GGGGLLLLUUUU____TTTTEEEESSSSSSSS____EEEERRRRRRRROOOORRRR____DDDDAAAATTTTAAAA
  286.                The same as the GGGGLLLLUUUU____TTTTEEEESSSSSSSS____EEEERRRRRRRROOOORRRR callback except that it takes an
  287.                additional pointer argument. This pointer is identical to the
  288.                opaque pointer provided when gggglllluuuuTTTTeeeessssssssBBBBeeeeggggiiiinnnnPPPPoooollllyyyyggggoooonnnn was called.
  289.                The function prototype for this callback is:
  290.  
  291.                     void errorData ( GLenum errno, void *polygon_data );
  292.  
  293.  
  294. EEEEXXXXAAAAMMMMPPPPLLLLEEEE
  295.      Polygons tessellated can be rendered directly like this:
  296.  
  297.  
  298.           gluTessCallback(tobj, GLU_TESS_BEGIN, glBegin);
  299.           gluTessCallback(tobj, GLU_TESS_VERTEX, glVertex3dv);
  300.           gluTessCallback(tobj, GLU_TESS_END, glEnd);
  301.           gluTessCallback(tobj, GLU_TESS_COMBINE, myCombine);
  302.           gluTessBeginPolygon(tobj, NULL);
  303.             gluTessBeginContour(tobj);
  304.               gluTessVertex(tobj, v, v);
  305.               ...
  306.             gluTessEndContour(tobj);
  307.           gluTessEndPolygon(tobj);
  308.  
  309.  
  310.      Typically, the tessellated polygon should be stored in a display list so
  311.      that it does not need to be retessellated every time it is rendered.
  312.  
  313. SSSSEEEEEEEE AAAALLLLSSSSOOOO
  314.      ggggllllBBBBeeeeggggiiiinnnn, ggggllllEEEEddddggggeeeeFFFFllllaaaagggg, ggggllllVVVVeeeerrrrtttteeeexxxx, gggglllluuuuNNNNeeeewwwwTTTTeeeessssssss, gggglllluuuuEEEErrrrrrrroooorrrrSSSSttttrrrriiiinnnngggg, gggglllluuuuTTTTeeeessssssssVVVVeeeerrrrtttteeeexxxx,
  315.      gggglllluuuuTTTTeeeessssssssBBBBeeeeggggiiiinnnnPPPPoooollllyyyyggggoooonnnn, gggglllluuuuTTTTeeeessssssssBBBBeeeeggggiiiinnnnCCCCoooonnnnttttoooouuuurrrr, gggglllluuuuTTTTeeeessssssssPPPPrrrrooooppppeeeerrrrttttyyyy, gggglllluuuuTTTTeeeessssssssNNNNoooorrrrmmmmaaaallll
  316.  
  317.  
  318.  
  319.  
  320.  
  321.  
  322.  
  323.  
  324.  
  325.  
  326.  
  327.                                                                         PPPPaaaaggggeeee 5555
  328.  
  329.  
  330.  
  331.