You are viewing a plain text version of this content. The canonical link for it is here.
Posted to dev@xalan.apache.org by bu...@apache.org on 2002/05/07 17:54:36 UTC

DO NOT REPLY [Bug 8879] New: - java.lang.OutOfMemoryError when processing large CALS tables - memory leak?

DO NOT REPLY TO THIS EMAIL, BUT PLEASE POST YOUR BUG 
RELATED COMMENTS THROUGH THE WEB INTERFACE AVAILABLE AT
<http://nagoya.apache.org/bugzilla/show_bug.cgi?id=8879>.
ANY REPLY MADE TO THIS MESSAGE WILL NOT BE COLLECTED AND 
INSERTED IN THE BUG DATABASE.

http://nagoya.apache.org/bugzilla/show_bug.cgi?id=8879

java.lang.OutOfMemoryError when processing large CALS tables - memory leak?

           Summary: java.lang.OutOfMemoryError when processing large CALS
                    tables - memory leak?
           Product: XalanJ2
           Version: 2.3
          Platform: PC
        OS/Version: Windows 9x
            Status: NEW
          Severity: Critical
          Priority: Other
         Component: org.apache.xalan
        AssignedTo: xalan-dev@xml.apache.org
        ReportedBy: phalferty@newbook.com


Our application is an SGML to HTML rendering tool.  We validate the SGML, 
convert to XML and transform to XML using XSLT.
A significant portion of the data is CALS tables and we have borrowed from Norm 
Walsh's DocBook code to perform these conversions.
When processing large tables, Xalan crashes with a java.lang.OutOfMemoryError 
and no further information.  
When I isolated which tables were causing the crash, I processed them 
individually.  By removing some rows and entries I finally got the table to 
render but as soon as I add one entry back in, the crash will reoccur.

This data is rendered successfully and properly using other XSLT processors 
such as Saxon.  In a comparison (admittedly not complete) of Saxon and Xalan, 
both seemed to be returning exactly the same values and iterating the same 
number of times right up to the point where Xalan crashed.  

Our client is already using Xalan for other purposes and wishes to remain 
consistent in their toolset but will be unable to unless this problem is 
remedied. They don't seem to receptive to the 'If tables crash it,  don't use 
tables!' solution. :P

Below is the xslt code for processing the tables followed by the XML to be 
processed.  Simply using the XML as your input with this xslt code will 
reproduce our error.  


Thanks 


---------------------- cals_table.xsl

<?xml version='1.0'?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
version='1.0'>

<xsl:param name="default.table.width" select="'80%'"/>


<!-- ************************************************* -->


<!-- ************************************************* -->
<!-- Most of the following code was borrowed from Norm Walsh -->


<xsl:template name="OUTPUT-ENTRY-ATTRIBUTES"/>

<xsl:template match="table">
  <xsl:apply-templates/>
</xsl:template>

<xsl:template match="tgroup">
  <table>
    <xsl:if test="../@pgwide=1">
      <xsl:attribute name="width">100%</xsl:attribute>
    </xsl:if>

    <xsl:attribute name="cellpadding">6</xsl:attribute>

    <xsl:choose>
      <xsl:when test="../@frame='all'">
        <xsl:attribute name="border">1</xsl:attribute>
      </xsl:when>
      <xsl:when test="../@frame='none'">
	   <xsl:attribute name="border">0</xsl:attribute>
      </xsl:when>
      <xsl:when test="../@frame='bottom'">
	   <xsl:attribute name="border">1</xsl:attribute>
      </xsl:when>
      <xsl:when test="../@frame='top'">
	   <xsl:attribute name="border">1</xsl:attribute>
      </xsl:when>
      <xsl:when test="../@frame='sides'">
	   <xsl:attribute name="border">border</xsl:attribute>
      </xsl:when>
      <xsl:when test="../@frame='topbot'">
	   <xsl:attribute name="border">1</xsl:attribute>
      </xsl:when>
      <xsl:otherwise>
        <xsl:attribute name="border">1</xsl:attribute>
      </xsl:otherwise>
    </xsl:choose>

    <xsl:variable name="colgroup">
      <colgroup>
        <xsl:call-template name="generate.colgroup">
          <xsl:with-param name="cols" select="@cols"/>
        </xsl:call-template>
      </colgroup>
    </xsl:variable>

    <xsl:variable name="table.width">
      <xsl:choose>
        <xsl:when test="$default.table.width = ''">
          <xsl:text>100%</xsl:text>
        </xsl:when>
        <xsl:otherwise>
          <xsl:value-of select="$default.table.width"/>
        </xsl:otherwise>
      </xsl:choose>
    </xsl:variable>

    <xsl:attribute name="width">
       <xsl:value-of select="$table.width"/>
    </xsl:attribute>

    <xsl:copy-of select="$colgroup"/>

    <xsl:apply-templates/>

   </table>
   <xsl:text disable-output-escaping="yes">&lt;br/&gt;</xsl:text>
   <xsl:text disable-output-escaping="yes">&lt;br/&gt;</xsl:text>
  </xsl:template>

<xsl:template match="colspec"></xsl:template>

<xsl:template match="spanspec"></xsl:template>

<xsl:template match="thead|tfoot">
  <xsl:element name="{name(.)}">
    <xsl:if test="@align">
      <xsl:attribute name="align">
        <xsl:value-of select="@align"/>
      </xsl:attribute>
    </xsl:if>
    <xsl:if test="@char">
      <xsl:attribute name="char">
        <xsl:value-of select="@char"/>
      </xsl:attribute>
    </xsl:if>
    <xsl:if test="@charoff">
      <xsl:attribute name="charoff">
        <xsl:value-of select="@charoff"/>
      </xsl:attribute>
    </xsl:if>
    <xsl:if test="@valign">
      <xsl:attribute name="valign">
        <xsl:value-of select="@valign"/>
      </xsl:attribute>
    </xsl:if>

    <xsl:apply-templates/>
  </xsl:element>
</xsl:template>

<xsl:template match="tbody">
  <tbody>
    <xsl:if test="@align">
      <xsl:attribute name="align">
        <xsl:value-of select="@align"/>
      </xsl:attribute>
    </xsl:if>
    <xsl:if test="@char">
      <xsl:attribute name="char">
        <xsl:value-of select="@char"/>
      </xsl:attribute>
    </xsl:if>
    <xsl:if test="@charoff">
      <xsl:attribute name="charoff">
        <xsl:value-of select="@charoff"/>
      </xsl:attribute>
    </xsl:if>
    <xsl:if test="@valign">
      <xsl:attribute name="valign">
        <xsl:value-of select="@valign"/>
      </xsl:attribute>
    </xsl:if>

    <xsl:apply-templates/>
  </tbody>
</xsl:template>

<xsl:template match="row">
  <tr>
    <xsl:if test="@align">
      <xsl:attribute name="align">
        <xsl:value-of select="@align"/>
      </xsl:attribute>
    </xsl:if>
    <xsl:if test="@char">
      <xsl:attribute name="char">
        <xsl:value-of select="@char"/>
      </xsl:attribute>
    </xsl:if>
    <xsl:if test="@charoff">
      <xsl:attribute name="charoff">
        <xsl:value-of select="@charoff"/>
      </xsl:attribute>
    </xsl:if>
    <xsl:if test="@valign">
      <xsl:attribute name="valign">
        <xsl:value-of select="@valign"/>
      </xsl:attribute>
    </xsl:if>
    <xsl:apply-templates/>
  </tr>
</xsl:template>

<xsl:template match="thead/row/entry">
  <xsl:call-template name="process.cell">
    <xsl:with-param name="cellgi">th</xsl:with-param>
  </xsl:call-template>
</xsl:template>

<xsl:template match="tbody/row/entry">
  <xsl:call-template name="process.cell">
    <xsl:with-param name="cellgi">td</xsl:with-param>
  </xsl:call-template>
</xsl:template>

<xsl:template match="tfoot/row/entry">
  <xsl:call-template name="process.cell">
    <xsl:with-param name="cellgi">th</xsl:with-param>
  </xsl:call-template>
</xsl:template>

<xsl:template name="process.cell">
  <xsl:param name="cellgi">td</xsl:param>
  <xsl:variable name="empty.cell" select="count(node()) = 0"/>

  <xsl:variable name="entry.colnum">
    <xsl:call-template name="entry.colnum"/>
  </xsl:variable>

  <xsl:if test="$entry.colnum != ''">
    <xsl:variable name="prev.entry" select="preceding-sibling::*[1]"/>
    <xsl:variable name="prev.ending.colnum">
      <xsl:choose>
        <xsl:when test="$prev.entry">
          <xsl:call-template name="entry.ending.colnum">
            <xsl:with-param name="entry" select="$prev.entry"/>
          </xsl:call-template>
        </xsl:when>
        <xsl:otherwise>0</xsl:otherwise>
      </xsl:choose>
    </xsl:variable>
    
    <xsl:call-template name="add-empty-entries">
      <xsl:with-param name="number">
        <xsl:choose>
          <xsl:when test="$prev.ending.colnum = ''">0</xsl:when>
          <xsl:otherwise>
            <xsl:value-of select="$entry.colnum - $prev.ending.colnum - 1"/>
          </xsl:otherwise>
        </xsl:choose>
      </xsl:with-param>
    </xsl:call-template>
  </xsl:if>

  <xsl:element name="{$cellgi}">

  <xsl:if test="@spanname">
  	<xsl:variable name="namest"
  	select="ancestor::tgroup/spanspec[@spanname=./@spanname]/@namest"/>
  	<xsl:variable name="nameend"
  	select="ancestor::tgroup/spanspec[@spanname=./@spanname]/@nameend"/>
	<xsl:variable name="colst"
	select="ancestor::*[colspec/@colname=$namest]/colspec
[@colname=$namest]/@colnum"/>
	<xsl:variable name="colend" 
	select="ancestor::*[colspec/@colname=$nameend]/colspec
[@colname=$nameend]/@colnum"/>
	<xsl:attribute name="colspan"><xsl:value-of select="number($colend) - 
number($colst) + 1"/></xsl:attribute>
  </xsl:if>

    <xsl:if test="@morerows">
      <xsl:attribute name="rowspan">
        <xsl:value-of select="@morerows+1"/>
      </xsl:attribute>
    </xsl:if>
    <xsl:if test="@namest">
      <xsl:attribute name="colspan">
        <xsl:call-template name="calculate.colspan"/>
      </xsl:attribute>
    </xsl:if>
    <xsl:if test="@align">
      <xsl:attribute name="align">
        <xsl:value-of select="@align"/>
      </xsl:attribute>
    </xsl:if>
    <xsl:if test="@char">
      <xsl:attribute name="char">
        <xsl:value-of select="@char"/>
      </xsl:attribute>
    </xsl:if>
    <xsl:if test="@charoff">
      <xsl:attribute name="charoff">
        <xsl:value-of select="@charoff"/>
      </xsl:attribute>
    </xsl:if>
    <xsl:if test="@valign">
      <xsl:attribute name="valign">
        <xsl:value-of select="@valign"/>
      </xsl:attribute>
    </xsl:if>

	<xsl:if test="@rowsep='1'">
		<xsl:attribute name="style">border-bottom:thin solid 
black</xsl:attribute>
	</xsl:if>

    <xsl:if test="not(preceding-sibling::*)
                  and ancestor::row/@id">
      <a name="{ancestor::row/@id}"/>
    </xsl:if>

    <xsl:if test="@id">
      <a name="{@id}"/>
    </xsl:if>

    <xsl:choose>
      <xsl:when test="$empty.cell">
        <xsl:text>&#160;</xsl:text>
      </xsl:when>
      <xsl:otherwise>
        <xsl:apply-templates/>
      </xsl:otherwise>
    </xsl:choose>
  </xsl:element>
</xsl:template>

<xsl:template name="add-empty-entries">
  <xsl:param name="number" select="'0'"/>
  <xsl:choose>
    <xsl:when test="$number &lt;= 0"></xsl:when>
    <xsl:otherwise>
      <td>&#160;</td>
      <xsl:call-template name="add-empty-entries">
        <xsl:with-param name="number" select="$number - 1"/>
      </xsl:call-template>
    </xsl:otherwise>
  </xsl:choose>
</xsl:template>


<xsl:template name="entry.colnum">
  <xsl:param name="entry" select="."/>
  <xsl:choose>
    <xsl:when test="$entry/@colname">
      <xsl:variable name="colname" select="$entry/@colname"/>
      <xsl:variable name="colspec"
      select="$entry/ancestor::tgroup/colspec[@colname=$colname]"/>
      <xsl:call-template name="colspec.colnum">
        <xsl:with-param name="colspec" select="$colspec"/>
      </xsl:call-template>
    </xsl:when>
    <xsl:when test="$entry/@namest">
      <xsl:variable name="namest" select="$entry/@namest"/>
      <xsl:variable name="colspec"
      select="$entry/ancestor::tgroup/colspec[@colname=$namest]"/>
      <xsl:call-template name="colspec.colnum">
        <xsl:with-param name="colspec" select="$colspec"/>
      </xsl:call-template>
    </xsl:when>
    <xsl:when test="count($entry/preceding-sibling::*) = 0">1</xsl:when>
    <xsl:otherwise>
      <xsl:variable name="pcol">
        <xsl:call-template name="entry.ending.colnum">
          <xsl:with-param name="entry" select="$entry/preceding-sibling::*[1]"/>
        </xsl:call-template>
      </xsl:variable>
      <xsl:value-of select="$pcol + 1"/>
    </xsl:otherwise>
  </xsl:choose>
</xsl:template>


<xsl:template name="entry.ending.colnum">
  <xsl:param name="entry" select="."/>

   <xsl:choose>
    <xsl:when test="$entry/@colname">
      <xsl:variable name="colname" select="$entry/@colname"/>
      <xsl:variable name="colspec" select="$entry/ancestor::tgroup/colspec
[@colname=$colname]"/>
      <xsl:call-template name="colspec.colnum">
        <xsl:with-param name="colspec" select="$colspec"/>
      </xsl:call-template>
    </xsl:when>
    
    <xsl:when test="$entry/@nameend">

      <xsl:variable name="nameend" select="$entry/@nameend"/>
      <xsl:variable name="colspec" select="$entry/ancestor::tgroup/colspec
[@colname=$nameend]"/>
      <xsl:call-template name="colspec.colnum">
        <xsl:with-param name="colspec" select="$colspec"/>
      </xsl:call-template>
    </xsl:when>
    <xsl:when test="count($entry/preceding-sibling::*) = 0">1</xsl:when>
    
    <xsl:otherwise>
      <xsl:variable name="pcol">
        <xsl:call-template name="entry.ending.colnum">
          <xsl:with-param name="entry" select="$entry/preceding-sibling::*[1]"/>
        </xsl:call-template>
       </xsl:variable>
      <xsl:value-of select="$pcol + 1"/>
    </xsl:otherwise>
  </xsl:choose>


</xsl:template>


<xsl:template name="colspec.colnum">
  <xsl:param name="colspec" select="."/>
  <xsl:choose>
    <xsl:when test="$colspec/@colnum">
      <xsl:value-of select="$colspec/@colnum"/>
    </xsl:when>
    <xsl:when test="$colspec/preceding-sibling::colspec">

   <!--
      <xsl:variable name="prec.colspec.colnum">
        <xsl:call-template name="colspec.colnum">
          <xsl:with-param name="colspec" select="$colspec/preceding-
sibling::colspec[1]"/>
        </xsl:call-template>
      </xsl:variable>
    -->  
      
      <xsl:value-of select="count($colspec/preceding-sibling::colspec) + 1"/>
    </xsl:when>
    <xsl:otherwise>1</xsl:otherwise>
  </xsl:choose>
</xsl:template>



<xsl:template name="generate.colgroup">
  <xsl:param name="cols" select="1"/>
  <xsl:param name="count" select="1"/>
  <xsl:choose>
    <xsl:when test="$count>$cols"></xsl:when>
    <xsl:otherwise>
      <xsl:call-template name="generate.col">
        <xsl:with-param name="countcol" select="$count"/>
      </xsl:call-template>
      <xsl:call-template name="generate.colgroup">
        <xsl:with-param name="cols" select="$cols"/>
        <xsl:with-param name="count" select="$count+1"/>
      </xsl:call-template>
    </xsl:otherwise>
  </xsl:choose>
</xsl:template>

<xsl:template name="generate.col">
  <xsl:param name="countcol">1</xsl:param>
  <xsl:param name="colspecs" select="./colspec"/>
  <xsl:param name="count">1</xsl:param>
  <xsl:param name="colnum">1</xsl:param>

  <xsl:choose>
    <xsl:when test="$count>count($colspecs)">
      <xsl:text disable-output-escaping="yes">&lt;col/&gt;</xsl:text>
    </xsl:when>
    <xsl:otherwise>
      <xsl:variable name="colspec" select="$colspecs[$count=position()]"/>
      <xsl:variable name="colspec.colnum">
        <xsl:choose>
          <xsl:when test="$colspec/@colnum">
            <xsl:value-of select="$colspec/@colnum"/>
          </xsl:when>
          <xsl:otherwise>
            <xsl:value-of select="$colnum"/>
          </xsl:otherwise>
        </xsl:choose>
      </xsl:variable>

      <xsl:choose>
        <xsl:when test="$colspec.colnum=$countcol">
          <col>
            <xsl:if test="$colspec/@align">
              <xsl:attribute name="align">
                <xsl:value-of select="$colspec/@align"/>
              </xsl:attribute>
            </xsl:if>
            <xsl:if test="$colspec/@char">
              <xsl:attribute name="char">
                <xsl:value-of select="$colspec/@char"/>
              </xsl:attribute>
            </xsl:if>
            <xsl:if test="$colspec/@charoff">
              <xsl:attribute name="charoff">
                <xsl:value-of select="$colspec/@charoff"/>
              </xsl:attribute>
            </xsl:if>
           </col>
        </xsl:when>
        <xsl:otherwise>
          <xsl:call-template name="generate.col">
            <xsl:with-param name="countcol" select="$countcol"/>
            <xsl:with-param name="colspecs" select="$colspecs"/>
            <xsl:with-param name="count" select="$count+1"/>
            <xsl:with-param name="colnum">
              <xsl:choose>
                <xsl:when test="$colspec/@colnum">
                  <xsl:value-of select="$colspec/@colnum + 1"/>
                </xsl:when>
                <xsl:otherwise>
                  <xsl:value-of select="$colnum + 1"/>
                </xsl:otherwise>
              </xsl:choose>
            </xsl:with-param>
           </xsl:call-template>
        </xsl:otherwise>
      </xsl:choose>
    </xsl:otherwise>
  </xsl:choose>

</xsl:template>

<xsl:template name="colspec.colwidth">
  <!-- when this macro is called, the current context must be an entry -->
  <xsl:param name="colname"></xsl:param>
  <!-- .. = row, ../.. = thead|tbody, ../../.. = tgroup -->
  <xsl:param name="colspecs" select="../../../../tgroup/colspec"/>
  <xsl:param name="count">1</xsl:param>
  <xsl:choose>
    <xsl:when test="$count>count($colspecs)"></xsl:when>
    <xsl:otherwise>
      <xsl:variable name="colspec" select="$colspecs[$count=position()]"/>
      <xsl:choose>
        <xsl:when test="$colspec/@colname=$colname">
          <xsl:value-of select="$colspec/@colwidth"/>
        </xsl:when>
        <xsl:otherwise>
          <xsl:call-template name="colspec.colwidth">
            <xsl:with-param name="colname" select="$colname"/>
            <xsl:with-param name="colspecs" select="$colspecs"/>
            <xsl:with-param name="count" select="$count+1"/>
          </xsl:call-template>
        </xsl:otherwise>
      </xsl:choose>
    </xsl:otherwise>
  </xsl:choose>
</xsl:template>

<xsl:template name="calculate.colspan">
  <xsl:param name="entry" select="."/>
  <xsl:variable name="namest" select="$entry/@namest"/>
  <xsl:variable name="nameend" select="$entry/@nameend"/>

  <xsl:variable name="scol">
    <xsl:call-template name="colspec.colnum">
      <xsl:with-param name="colspec" select="$entry/ancestor::tgroup/colspec
[@colname=$namest]"/>
    </xsl:call-template>
  </xsl:variable>
  <xsl:variable name="ecol">
    <xsl:call-template name="colspec.colnum">
      <xsl:with-param name="colspec" select="$entry/ancestor::tgroup/colspec
[@colname=$nameend]"/>
    </xsl:call-template>
  </xsl:variable>
  <xsl:value-of select="$ecol - $scol + 1"/>
</xsl:template>

</xsl:stylesheet>


----------------------- table1.xml

<?xml version="1.0"?>
<!DOCTYPE erf[
]>
<table
frame="none"
tabstyle="squeeze5"
><tgroup
cols="19"
rowsep="0"
align="left"
colsep="0"
><colspec
colname="1"
colwidth="50pt"
align="left"
></colspec><colspec
colname="2"
colwidth="50pt"
align="left"
></colspec><colspec
colname="3"
colwidth="50pt"
align="left"
></colspec><colspec
colname="4"
colwidth="50pt"
align="left"
></colspec><colspec
colname="5"
colwidth="50pt"
align="left"
></colspec><colspec
colname="6"
colwidth="50pt"
align="left"
></colspec><colspec
colname="7"
colwidth="50pt"
align="left"
></colspec><colspec
colname="8"
colwidth="50pt"
align="left"
></colspec><colspec
colname="9"
colwidth="50pt"
align="left"
></colspec><colspec
colname="10"
colwidth="50pt"
align="left"
></colspec><colspec
colname="11"
colwidth="50pt"
align="left"
></colspec><colspec
colname="12"
colwidth="50pt"
align="left"
></colspec><colspec
colname="13"
colwidth="50pt"
align="left"
></colspec><colspec
colname="14"
colwidth="50pt"
align="left"
></colspec><colspec
colname="15"
colwidth="50pt"
align="left"
></colspec><colspec
colname="16"
colwidth="50pt"
align="left"
></colspec><colspec
colname="17"
colwidth="50pt"
align="left"
></colspec><colspec
colname="18"
colwidth="50pt"
align="left"
></colspec><colspec
colname="19"
colwidth="79pt"
align="left"
></colspec><tbody
valign="top"
><row
><entry
align="right"
></entry><entry
align="right"
>1989</entry><entry
align="right"
>1990</entry><entry
align="right"
>1991</entry><entry
align="right"
>1992</entry><entry
align="right"
>1993</entry><entry
align="right"
>1994</entry><entry
align="right"
>1995</entry><entry
align="right"
>1996</entry><entry
align="right"
>1997</entry><entry
align="right"
>1998</entry><entry
align="right"
>1999</entry><entry
align="right"
>2000</entry><entry
align="right"
>2001</entry><entry
align="right"
>2002</entry><entry
align="right"
>2003</entry><entry
align="right"
>2004</entry><entry
align="right"
>2005</entry><entry
align="right"
>Total</entry></row><row
><entry
align="justify"
>January</entry><entry
align="right"
>532</entry><entry
align="right"
>35345</entry><entry
align="right"
>3454</entry><entry
align="right"
>6436</entry><entry
align="right"
>153</entry><entry
align="right"
>63474</entry><entry
align="right"
>23423</entry><entry
align="right"
>84564</entry><entry
align="right"
>3543</entry><entry
align="right"
>3573</entry><entry
align="right"
>534</entry><entry
align="right"
>886</entry><entry
align="right"
>453</entry><entry
align="right"
>899567</entry><entry
align="right"
>6442</entry><entry
align="right"
>6442</entry><entry
align="right"
>234</entry><entry
align="right"
>1139055</entry></row><row
><entry
align="justify"
>February</entry><entry
align="right"
>54245</entry><entry
align="right"
>3453</entry><entry
align="right"
>345</entry><entry
align="right"
>670</entry><entry
align="right"
>14452</entry><entry
align="right"
>57</entry><entry
align="right"
>2432</entry><entry
align="right"
>234</entry><entry
align="right"
>357</entry><entry
align="right"
>3543</entry><entry
align="right"
>625</entry><entry
align="right"
>864</entry><entry
align="right"
>2432</entry><entry
align="right"
>234</entry><entry
align="right"
>234634</entry><entry
align="right"
>234634</entry><entry
align="right"
>4564</entry><entry
align="right"
>557775</entry></row><row
><entry
align="justify"
>March</entry><entry
align="right"
>45224</entry><entry
align="right"
>453</entry><entry
align="right"
>34543</entry><entry
align="right"
>470</entry><entry
align="right"
>15232</entry><entry
align="right"
>575</entry><entry
align="right"
>2432</entry><entry
align="right"
>4564</entry><entry
align="right"
>453</entry><entry
align="right"
>357</entry><entry
align="right"
>3534</entry><entry
align="right"
>3543</entry><entry
align="right"
>2465</entry><entry
align="right"
>4564</entry><entry
align="right"
>1234</entry><entry
align="right"
>1234</entry><entry
align="right"
>453</entry><entry
align="right"
>121330</entry></row><row
><entry
align="justify"
>April</entry><entry
align="right"
>245</entry><entry
align="right"
>770</entry><entry
align="right"
>7652</entry><entry
align="right"
>886</entry><entry
align="right"
>1400</entry><entry
align="right"
>7565</entry><entry
align="right"
>2432</entry><entry
align="right"
>435</entry><entry
align="right"
>2432</entry><entry
align="right"
>453</entry><entry
align="right"
>3543</entry><entry
align="right"
>357</entry><entry
align="right"
>243</entry><entry
align="right"
>453</entry><entry
align="right"
>1452</entry><entry
align="right"
>1452</entry><entry
align="right"
>2432</entry><entry
align="right"
>34202</entry></row><row
><entry
align="justify"
>May</entry><entry
align="right"
>534</entry><entry
align="right"
>64564</entry><entry
align="right"
>175</entry><entry
align="right"
>864</entry><entry
align="right"
>1234</entry><entry
align="right"
>5645</entry><entry
align="right"
>2465</entry><entry
align="right"
>6442</entry><entry
align="right"
>2465</entry><entry
align="right"
>2432</entry><entry
align="right"
>357</entry><entry
align="right"
>99567</entry><entry
align="right"
>84564</entry><entry
align="right"
>2432</entry><entry
align="right"
>234</entry><entry
align="right"
>234</entry><entry
align="right"
>2465</entry><entry
align="right"
>276673</entry></row><row
><entry
align="justify"
>June</entry><entry
align="right"
>5498</entry><entry
align="right"
>987</entry><entry
align="right"
>1457</entry><entry
align="right"
>3543</entry><entry
align="right"
>1452</entry><entry
align="right"
>576</entry><entry
align="right"
>243</entry><entry
align="right"
>234634</entry><entry
align="right"
>243</entry><entry
align="right"
>2465</entry><entry
align="right"
>453</entry><entry
align="right"
>3543</entry><entry
align="right"
>34635</entry><entry
align="right"
>2465</entry><entry
align="right"
>4564</entry><entry
align="right"
>4564</entry><entry
align="right"
>243</entry><entry
align="right"
>301565</entry></row><row
><entry
align="justify"
>July</entry><entry
align="right"
>885</entry><entry
align="right"
>453</entry><entry
align="right"
>6473</entry><entry
align="right"
>357</entry><entry
align="right"
>232</entry><entry
align="right"
>3456</entry><entry
align="right"
>84564</entry><entry
align="right"
>1234</entry><entry
align="right"
>84564</entry><entry
align="right"
>243</entry><entry
align="right"
>3535</entry><entry
align="right"
>357</entry><entry
align="right"
>6442</entry><entry
align="right"
>243</entry><entry
align="right"
>453</entry><entry
align="right"
>234</entry><entry
align="right"
>84564</entry><entry
align="right"
>278289</entry></row><row
><entry
align="justify"
>August</entry><entry
align="right"
>4543</entry><entry
align="right"
>6546</entry><entry
align="right"
>273</entry><entry
align="right"
>453</entry><entry
align="right"
>3535</entry><entry
align="right"
>5399</entry><entry
align="right"
>234</entry><entry
align="right"
>1452</entry><entry
align="right"
>2432</entry><entry
align="right"
>84564</entry><entry
align="right"
>4564</entry><entry
align="right"
>453</entry><entry
align="right"
>234634</entry><entry
align="right"
>84564</entry><entry
align="right"
>2432</entry><entry
align="right"
>4564</entry><entry
align="right"
>34635</entry><entry
align="right"
>475277</entry></row><row
><entry
align="justify"
>September</entry><entry
align="right"
>7454</entry><entry
align="right"
>6346</entry><entry
align="right"
>27438</entry><entry
align="right"
>34563</entry><entry
align="right"
>3532</entry><entry
align="right"
>3534</entry><entry
align="right"
>4564</entry><entry
align="right"
>232</entry><entry
align="right"
>2465</entry><entry
align="right"
>34635</entry><entry
align="right"
>3543</entry><entry
align="right"
>2432</entry><entry
align="right"
>1234</entry><entry
align="right"
>34635</entry><entry
align="right"
>2465</entry><entry
align="right"
>6442</entry><entry
align="right"
>6442</entry><entry
align="right"
>181956</entry></row><row
><entry
align="justify"
>October</entry><entry
align="right"
>858</entry><entry
align="right"
>3453</entry><entry
align="right"
>366</entry><entry
align="right"
>345</entry><entry
align="right"
>23411</entry><entry
align="right"
>3454</entry><entry
align="right"
>435</entry><entry
align="right"
>3543</entry><entry
align="right"
>243</entry><entry
align="right"
>23446</entry><entry
align="right"
>357</entry><entry
align="right"
>2465</entry><entry
align="right"
>1452</entry><entry
align="right"
>234</entry><entry
align="right"
>243</entry><entry
align="right"
>234634</entry><entry
align="right"
>234634</entry><entry
align="right"
>533573</entry></row><row
><entry
align="justify"
>November</entry><entry
align="right"
>9058</entry><entry
align="right"
>432</entry><entry
align="right"
>46452</entry><entry
align="right"
>367</entry><entry
align="right"
>1352</entry><entry
align="right"
>2432</entry><entry
align="right"
>6442</entry><entry
align="right"
>357</entry><entry
align="right"
>84564</entry><entry
align="right"
>776453</entry><entry
align="right"
>453</entry><entry
align="right"
>243</entry><entry
align="right"
>234</entry><entry
align="right"
>4564</entry><entry
align="right"
>84564</entry><entry
align="right"
>1234</entry><entry
align="right"
>1234</entry><entry
align="right"
>1020435</entry></row><row
><entry
align="justify"
>December</entry><entry
align="right"
>9585</entry><entry
align="right"
>543</entry><entry
align="right"
>235</entry><entry
align="right"
>867</entry><entry
align="right"
>32444</entry><entry
align="right"
>23423</entry><entry
align="right"
>234634</entry><entry
align="right"
>453</entry><entry
align="right"
>3452</entry><entry
align="right"
>54646</entry><entry
align="right"
>353</entry><entry
align="right"
>84564</entry><entry
align="right"
>4564</entry><entry
align="right"
>99576</entry><entry
align="right"
>34635</entry><entry
align="right"
>1452</entry><entry
align="right"
>1452</entry><entry
align="right"
>586878</entry></row><row
><entry
align="justify"
>Total</entry><entry
align="right"
>140650</entry><entry
align="right"
>125335</entry><entry
align="right"
>130854</entry><entry
align="right"
>51813</entry><entry
align="right"
>100422</entry><entry
align="right"
>121584</entry><entry
align="right"
>366295</entry><entry
align="right"
>340140</entry><entry
align="right"
>189210</entry><entry
align="right"
>988808</entry><entry
align="right"
>23850</entry><entry
align="right"
>201274</entry><entry
align="right"
>375353</entry><entry
align="right"
>1135533</entry><entry
align="right"
>375355</entry><entry
align="right"
>499124</entry><entry
align="right"
>375357</entry><entry
align="right"
>5507008</entry></row></tbody></tgroup></table>