4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync# This file is used to create report for Eot tool
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync# Copyright (c) 2008 - 2010, Intel Corporation. All rights reserved.<BR>
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync# This program and the accompanying materials
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync# are licensed and made available under the terms and conditions of the BSD License
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync# which accompanies this distribution. The full text of the license may be found at
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync# THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync# WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync# Import Modules
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync## Report() class
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync# This class defined Report
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync# @param object: Inherited from object class
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ## The constructor
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync # @param self: The object pointer
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync # @param ReportName: name of the report
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync # @param FvObj: FV object after parsing FV images
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync def __init__(self, ReportName = 'Report.html', FvObj = None, DispatchName=None):
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync EotGlobalData.gMACRO['EFI_SOURCE'] = EotGlobalData.gMACRO['EDK_SOURCE']
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ## WriteLn() method
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync # Write a line in the report
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync # @param self: The object pointer
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync # @param Line: The lint to be written into
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ## GenerateReport() method
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync # A caller to generate report
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync # @param self: The object pointer
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ## GenerateUnDispatchedList() method
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync # Create a list for not dispatched items
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync # @param self: The object pointer
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync EotGlobalData.gOP_UN_DISPATCHED.write('%s\n' % FvObj.Name)
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync EotGlobalData.gOP_UN_DISPATCHED.write('%s\n' % FvObj.UnDispatchedFfsDict[Item])
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ## GenerateFv() method
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync # Generate FV information
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync # @param self: The object pointer
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync <td width="20%%"><strong>Name</strong></td>
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync <td width="60%%"><strong>Guid</strong></td>
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync <td width="20%%"><strong>Size</strong></td>
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync <td>%s</td>
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync <td>%s</td>
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync <td>%s</td>
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Content = """ <td colspan="3"><table width="100%%" border="1">
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync EotGlobalData.gOP_DISPATCH_ORDER.write('Dispatched:\n')
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync # For UnDispatched
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Content = """ <td colspan="3"><table width="100%%" border="1">
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync <tr><strong>UnDispatched</strong></tr>"""
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync EotGlobalData.gOP_DISPATCH_ORDER.write('\nUnDispatched:\n')
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ## GenerateDepex() method
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync # Generate Depex information
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync # @param self: The object pointer
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync # @param DepexString: A DEPEX string needed to be parsed
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync NonGuidList = ['AND', 'OR', 'NOT', 'BEFORE', 'AFTER', 'TRUE', 'FALSE']
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync SqlCommand = """select DISTINCT GuidName from Report where GuidValue like '%s' and ItemMode = 'Produced' group by GuidName""" % (Item)
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync RecordSet = EotGlobalData.gDb.TblReport.Exec(SqlCommand)
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync <td width="5%%"></td>
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync <td width="95%%">%s</td>
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ## GeneratePpi() method
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync # Generate PPI information
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync # @param self: The object pointer
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync # @param Name: CName of a GUID
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync # @param Guid: Value of a GUID
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync # @param Type: Type of a GUID
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync self.GeneratePpiProtocol('Ppi', Name, Guid, Type, self.PpiIndex)
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ## GenerateProtocol() method
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync # Generate PROTOCOL information
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync # @param self: The object pointer
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync # @param Name: CName of a GUID
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync # @param Guid: Value of a GUID
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync # @param Type: Type of a GUID
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync self.GeneratePpiProtocol('Protocol', Name, Guid, Type, self.ProtocolIndex)
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ## GeneratePpiProtocol() method
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync # Generate PPI/PROTOCOL information
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync # @param self: The object pointer
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync # @param Model: Model of a GUID, PPI or PROTOCOL
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync # @param Name: Name of a GUID
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync # @param Guid: Value of a GUID
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync # @param Type: Type of a GUID
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync # @param CName: CName(Index) of a GUID
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync def GeneratePpiProtocol(self, Model, Name, Guid, Type, CName):
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync <td width="5%%"></td>
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync <td width="10%%">%s</td>
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync <td width="85%%" colspan="3">%s</td>
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync <!-- %s -->
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync SqlCommand = """select DISTINCT SourceFileFullPath, BelongsToFunction from Report where GuidName like '%s' and ItemMode = 'Callback'""" % Name
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync RecordSet = EotGlobalData.gDb.TblReport.Exec(SqlCommand)
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync where ID = (
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync select DISTINCT BelongsToFile from Inf
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ModuleSet = EotGlobalData.gDb.TblReport.Exec(SqlCommand)
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Inf = ModuleSet[0][0].replace(EotGlobalData.gMACRO['WORKSPACE'], '.')
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync <td width="5%%"></td>
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync <td width="10%%">%s</td>
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync <td width="40%%">%s</td>
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync <td width="35%%">%s</td>
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync <td width="10%%">%s</td>
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ## GenerateFfs() method
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync # Generate FFS information
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync # @param self: The object pointer
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync # @param FfsObj: FFS object after FV image is parsed
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if FfsObj != None and FfsObj.Type in [0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0xA]:
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync # Hard code for Binary INF
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if FfsGuid.upper() == '7BB28B99-61BB-11D5-9A5D-0090273FC14D':
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if FfsGuid.upper() == '7E374E25-8E01-4FEE-87F2-390C23C606CD':
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if FfsGuid.upper() == '961578FE-B6B7-44C3-AF35-6BC705CD2B1F':
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync # Find FFS Path and Name
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync where BelongsToFile = (select BelongsToFile from Inf where Value1 = 'FILE_GUID' and lower(Value2) = lower('%s') and Model = %s)
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync and Model = %s and Value1='BASE_NAME'""" % (FfsGuid, 5001, 5001)
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync RecordSet = EotGlobalData.gDb.TblReport.Exec(SqlCommand)
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync where ID = (select BelongsToFile from Inf where Value1 = 'FILE_GUID' and lower(Value2) = lower('%s') and Model = %s)
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync RecordSet = EotGlobalData.gDb.TblReport.Exec(SqlCommand)
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync <tr class='styleFfs' id='FfsHeader%s'>
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync <td width="55%%"><span onclick="Display('FfsHeader%s', 'Ffs%s')" onMouseOver="funOnMouseOver()" onMouseOut="funOnMouseOut()">%s</span></td>
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync <td width="15%%">%s</td>
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync <!--<td width="20%%">%s</td>-->
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync <!--<td width="20%%">%s</td>-->
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync <td width="10%%">%s</td>
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync <tr id='Ffs%s' style='display:none;'>
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync <td colspan="4"><table width="100%%" border="1">""" % (self.FfsIndex, self.FfsIndex, self.FfsIndex, FfsPath, FfsName, FfsGuid, FfsOffset, FfsType, self.FfsIndex)
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync self.DispatchList.write("%s %s %s %s\n" % (FfsGuid, "P", FfsName, FfsPath))
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync self.DispatchList.write("%s %s %s %s\n" % (FfsGuid, "D", FfsName, FfsPath))
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync EotGlobalData.gOP_DISPATCH_ORDER.write('%s\n' %FfsName)
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync <td><span id='DepexHeader%s' class="styleDepex" onclick="Display('DepexHeader%s', 'Depex%s')" onMouseOver="funOnMouseOver()" onMouseOut="funOnMouseOut()">  DEPEX expression</span></td>
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync <tr id='Depex%s' style='display:none;'>
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync <td><table width="100%%" border="1">""" % (self.FfsIndex, self.FfsIndex, self.FfsIndex, self.FfsIndex)
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync # End of DEPEX
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync # Find Consumed Ppi/Protocol
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync SqlCommand = """select ModuleName, ItemType, GuidName, GuidValue, GuidMacro from Report
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync where SourceFileFullPath in
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync (select Value1 from Inf where BelongsToFile =
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync (select BelongsToFile from Inf
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync where Value1 = 'FILE_GUID' and Value2 like '%s' and Model = %s)
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync and Model = %s)
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync and ItemMode = 'Consumed' group by GuidName order by ItemType""" \
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync RecordSet = EotGlobalData.gDb.TblReport.Exec(SqlCommand)
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync <td><span id='ConsumedHeader%s' class="styleConsumed" onclick="Display('ConsumedHeader%s', 'Consumed%s')" onMouseOver="funOnMouseOver()" onMouseOut="funOnMouseOut()">  Consumed Ppis/Protocols List (%s)</span></td>
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync <tr id='Consumed%s' style='display:none;'>
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync <td><table width="100%%" border="1">""" % (self.FfsIndex, self.FfsIndex, self.FfsIndex, Count, self.FfsIndex)
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync self.GeneratePpiProtocol(Type, Name, Guid, 'Consumed', CName)
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync #End of Consumed Ppi/Portocol
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync # Find Produced Ppi/Protocol
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync SqlCommand = """select ModuleName, ItemType, GuidName, GuidValue, GuidMacro from Report
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync where SourceFileFullPath in
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync (select Value1 from Inf where BelongsToFile =
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync (select BelongsToFile from Inf
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync where Value1 = 'FILE_GUID' and Value2 like '%s' and Model = %s)
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync and Model = %s)
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync and ItemMode = 'Produced' group by GuidName order by ItemType""" \
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync RecordSet = EotGlobalData.gDb.TblReport.Exec(SqlCommand)
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync <td><span id='ProducedHeader%s' class="styleProduced" onclick="Display('ProducedHeader%s', 'Produced%s')" onMouseOver="funOnMouseOver()" onMouseOut="funOnMouseOut()">  Produced Ppis/Protocols List (%s)</span></td>
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync <tr id='Produced%s' style='display:none;'>
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync <td><table width="100%%" border="1">""" % (self.FfsIndex, self.FfsIndex, self.FfsIndex, Count, self.FfsIndex)
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync self.GeneratePpiProtocol(Type, Name, Guid, 'Produced', CName)
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync # End of Produced Ppi/Protocol
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ## GenerateTail() method
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync # Generate end tags of HTML report
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync # @param self: The object pointer
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ## GenerateHeader() method
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync # Generate start tags of HTML report
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync # @param self: The object pointer
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Header = """<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync<title>Execution Order Tool Report</title>
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync<meta http-equiv="Content-Type" content="text/html">
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync<style type="text/css">
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync color: #006600;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync font-weight: bold;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync.styleDepex {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync color: #FF0066;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync font-weight: bold;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync.styleProduced {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync color: #0000FF;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync font-weight: bold;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync.styleConsumed {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync color: #FF00FF;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync font-weight: bold;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync<Script type="text/javascript">
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncfunction Display(ParentID, SubID)
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync SubItem = document.getElementById(SubID);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ParentItem = document.getElementById(ParentID);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (SubItem.style.display == 'none')
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync SubItem.style.display = ''
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ParentItem.style.fontWeight = 'normal'
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync SubItem.style.display = 'none'
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ParentItem.style.fontWeight = 'bold'
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncfunction funOnMouseOver()
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync document.body.style.cursor = "hand";
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncfunction funOnMouseOut()
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync document.body.style.cursor = "";
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync<table width="100%%" border="1">"""
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync# This acts like the main() function for the script, unless it is 'import'ed into another
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync # Initialize log system