OpenCores
URL https://opencores.org/ocsvn/usbhostslave/usbhostslave/trunk

Subversion Repositories usbhostslave

Compare Revisions

  • This comparison shows the changes necessary to convert path
    /usbhostslave/trunk/usbDevice/syn
    from Rev 39 to Rev 40
    Reverse comparison

Rev 39 → Rev 40

/altera/usbDeviceAlteraTop.qsf
0,0 → 1,202
# Copyright (C) 1991-2006 Altera Corporation
# Your use of Altera Corporation's design tools, logic functions
# and other software and tools, and its AMPP partner logic
# functions, and any output files from any of the foregoing
# (including device programming or simulation files), and any
# associated documentation or information are expressly subject
# to the terms and conditions of the Altera Program License
# Subscription Agreement, Altera MegaCore Function License
# Agreement, or other applicable license agreement, including,
# without limitation, that your use is for the sole purpose of
# programming logic devices manufactured by Altera and sold by
# Altera or its authorized distributors. Please refer to the
# applicable agreement for further details.
 
 
# The default values for assignments are stored in the file
# cyc_or12_mini_top_assignment_defaults.qdf
# If this file doesn't exist, and for assignments not listed, see file
# assignment_defaults.qdf
 
# Altera recommends that you do not modify this file. This
# file is updated automatically by the Quartus II software
# and any changes you make may be lost or overwritten.
 
 
set_global_assignment -name FAMILY "Cyclone II"
set_global_assignment -name DEVICE EP2C20Q240C8
set_global_assignment -name TOP_LEVEL_ENTITY usbDeviceAlteraTop
set_global_assignment -name ORIGINAL_QUARTUS_VERSION 6.1
set_global_assignment -name PROJECT_CREATION_TIME_DATE "06:48:46 JUNE 20, 2007"
set_global_assignment -name LAST_QUARTUS_VERSION "7.2 SP3"
 
#48MHz local oscillator
set_global_assignment -name FMAX_REQUIREMENT "20.83 ns" -section_id clk
set_global_assignment -name DUTY_CYCLE 50 -section_id clk
 
set_global_assignment -name RESERVE_PIN "AS INPUT TRI-STATED"
set_global_assignment -name RESERVE_ALL_UNUSED_PINS "AS INPUT TRI-STATED WITH WEAK PULL-UP"
set_global_assignment -name CUT_OFF_PATHS_BETWEEN_CLOCK_DOMAINS ON
 
 
set_location_assignment PIN_30 -to clk
 
 
set_location_assignment PIN_97 -to mc_addr[0]
set_location_assignment PIN_96 -to mc_addr[1]
set_location_assignment PIN_90 -to mc_addr[2]
set_location_assignment PIN_166 -to mc_addr[3]
set_location_assignment PIN_165 -to mc_addr[4]
set_location_assignment PIN_164 -to mc_addr[5]
set_location_assignment PIN_162 -to mc_addr[6]
set_location_assignment PIN_161 -to mc_addr[7]
set_location_assignment PIN_159 -to mc_addr[8]
set_location_assignment PIN_157 -to mc_addr[9]
set_location_assignment PIN_100 -to mc_addr[10]
set_location_assignment PIN_109 -to mc_addr[11]
 
set_location_assignment PIN_106 -to mc_ba[0]
set_location_assignment PIN_105 -to mc_ba[1]
 
set_location_assignment PIN_113 -to mc_cas_
set_location_assignment PIN_156 -to mc_cke_
set_location_assignment PIN_155 -to sdram_clk
set_location_assignment PIN_110 -to sdram_cs
set_location_assignment PIN_116 -to mc_dqm[0]
set_location_assignment PIN_150 -to mc_dqm[1]
set_location_assignment PIN_88 -to mc_dqm[2]
set_location_assignment PIN_167 -to mc_dqm[3]
 
set_location_assignment PIN_111 -to mc_ras_
set_location_assignment PIN_114 -to mc_we_
 
set_location_assignment PIN_47 -to spiClk
set_location_assignment PIN_20 -to spiMasterDataOut
set_location_assignment PIN_44 -to spiCS_n
 
#set_location_assignment PIN_18 -to usbHostOE_n
#set_location_assignment PIN_8 -to usbSlaveVP
#set_location_assignment PIN_7 -to usbSlaveVM
#set_location_assignment PIN_9 -to usbSlaveOE_n
#set_location_assignment PIN_13 -to usbDPlusPullup
#set_location_assignment PIN_4 -to vBusDetect
 
# Santa Cruz Connector
set_location_assignment PIN_16 -to SC_P_CLK
set_location_assignment PIN_15 -to SC_PCS_N
set_location_assignment PIN_188 -to SC_RST_N
set_location_assignment PIN_191 -to SC_P0
set_location_assignment PIN_189 -to SC_P1
set_location_assignment PIN_194 -to SC_P2
set_location_assignment PIN_192 -to SC_P3
set_location_assignment PIN_199 -to SC_P4
set_location_assignment PIN_197 -to SC_P5
set_location_assignment PIN_208 -to SC_P6
set_location_assignment PIN_203 -to SC_P7
set_location_assignment PIN_218 -to SC_P8
set_location_assignment PIN_216 -to SC_P9
set_location_assignment PIN_226 -to SC_P10
set_location_assignment PIN_223 -to SC_P11
set_location_assignment PIN_231 -to SC_P12
set_location_assignment PIN_230 -to SC_P13
set_location_assignment PIN_234 -to SC_P14
set_location_assignment PIN_233 -to SC_P15
set_location_assignment PIN_236 -to SC_P16
set_location_assignment PIN_237 -to SC_P17
set_location_assignment PIN_238 -to SC_P18
set_location_assignment PIN_5 -to SC_P19
set_location_assignment PIN_4 -to SC_P20
set_location_assignment PIN_6 -to SC_P21
set_location_assignment PIN_7 -to SC_P22
set_location_assignment PIN_8 -to SC_P23
set_location_assignment PIN_9 -to SC_P24
set_location_assignment PIN_11 -to SC_P25
set_location_assignment PIN_13 -to SC_P26
set_location_assignment PIN_14 -to SC_P27
set_location_assignment PIN_18 -to SC_P28
set_location_assignment PIN_184 -to SC_P29
set_location_assignment PIN_185 -to SC_P30
set_location_assignment PIN_186 -to SC_P31
set_location_assignment PIN_187 -to SC_P32
set_location_assignment PIN_195 -to SC_P33
set_location_assignment PIN_200 -to SC_P34
set_location_assignment PIN_214 -to SC_P35
set_location_assignment PIN_222 -to SC_P36
set_location_assignment PIN_228 -to SC_P37
set_location_assignment PIN_232 -to SC_P38
set_location_assignment PIN_235 -to SC_P39
 
 
 
set_global_assignment -name ENABLE_SIGNALTAP ON
set_global_assignment -name USE_SIGNALTAP_FILE stp1.stp
 
 
 
 
set_global_assignment -name NUMBER_OF_PATHS_TO_REPORT 1000
 
set_global_assignment -name TIMEQUEST_MULTICORNER_ANALYSIS OFF
set_global_assignment -name USE_TIMEQUEST_TIMING_ANALYZER ON
 
 
set_global_assignment -name TIMEQUEST_DO_REPORT_TIMING ON
 
set_global_assignment -name CYCLONEII_CONFIGURATION_SCHEME "PASSIVE SERIAL"
set_global_assignment -name STRATIX_DEVICE_IO_STANDARD "3.3-V LVTTL"
set_global_assignment -name CYCLONEII_RESERVE_NCEO_AFTER_CONFIGURATION "USE AS REGULAR IO"
 
 
set_global_assignment -name USE_GENERATED_PHYSICAL_CONSTRAINTS OFF -section_id eda_palace
set_global_assignment -name PARTITION_NETLIST_TYPE SOURCE -section_id Top
set_global_assignment -name PARTITION_COLOR 2147039 -section_id Top
set_global_assignment -name LL_ROOT_REGION ON -section_id "Root Region"
set_global_assignment -name LL_MEMBER_STATE LOCKED -section_id "Root Region"
set_instance_assignment -name CLOCK_SETTINGS clk -to clk
set_instance_assignment -name PARTITION_HIERARCHY no_file_for_top_partition -to | -section_id Top
 
set_global_assignment -name USER_LIBRARIES "..\\..\\..\\rtl\\include;..\\..\\rtl"
 
set_global_assignment -name VERILOG_FILE ../../../RTL/wrapper/usbSlave.v
set_global_assignment -name VERILOG_FILE ../../../RTL/slaveController/USBSlaveControlBI.v
set_global_assignment -name VERILOG_FILE ../../../RTL/slaveController/endpMux.v
set_global_assignment -name VERILOG_FILE ../../../RTL/slaveController/fifoMux.v
set_global_assignment -name VERILOG_FILE ../../../RTL/slaveController/sctxportarbiter.v
set_global_assignment -name VERILOG_FILE ../../../RTL/slaveController/slavecontroller.v
set_global_assignment -name VERILOG_FILE ../../../RTL/slaveController/slaveDirectcontrol.v
set_global_assignment -name VERILOG_FILE ../../../RTL/slaveController/slaveGetpacket.v
set_global_assignment -name VERILOG_FILE ../../../RTL/slaveController/slaveRxStatusMonitor.v
set_global_assignment -name VERILOG_FILE ../../../RTL/slaveController/slaveSendpacket.v
set_global_assignment -name VERILOG_FILE ../../../RTL/slaveController/usbSlaveControl.v
set_global_assignment -name VERILOG_FILE ../../../RTL/serialInterfaceEngine/writeUSBWireData.v
set_global_assignment -name VERILOG_FILE ../../../RTL/serialInterfaceEngine/lineControlUpdate.v
set_global_assignment -name VERILOG_FILE ../../../RTL/serialInterfaceEngine/processRxBit.v
set_global_assignment -name VERILOG_FILE ../../../RTL/serialInterfaceEngine/processRxByte.v
set_global_assignment -name VERILOG_FILE ../../../RTL/serialInterfaceEngine/processTxByte.v
set_global_assignment -name VERILOG_FILE ../../../RTL/serialInterfaceEngine/readUSBWireData.v
set_global_assignment -name VERILOG_FILE ../../../RTL/serialInterfaceEngine/siereceiver.v
set_global_assignment -name VERILOG_FILE ../../../RTL/serialInterfaceEngine/SIETransmitter.v
set_global_assignment -name VERILOG_FILE ../../../RTL/serialInterfaceEngine/updateCRC5.v
set_global_assignment -name VERILOG_FILE ../../../RTL/serialInterfaceEngine/updateCRC16.v
set_global_assignment -name VERILOG_FILE ../../../RTL/serialInterfaceEngine/usbSerialInterfaceEngine.v
set_global_assignment -name VERILOG_FILE ../../../RTL/serialInterfaceEngine/usbTxWireArbiter.v
set_global_assignment -name VERILOG_FILE ../../../RTL/hostSlaveMux/hostSlaveMuxBI.v
set_global_assignment -name VERILOG_FILE ../../../RTL/hostSlaveMux/hostSlaveMux.v
set_global_assignment -name VERILOG_FILE ../../../RTL/busInterface/wishBoneBI.v
set_global_assignment -name VERILOG_FILE ../../../RTL/buffers/TxFifoBI.v
set_global_assignment -name VERILOG_FILE ../../../RTL/buffers/dpMem_dc.v
set_global_assignment -name VERILOG_FILE ../../../RTL/buffers/fifoRTL.v
set_global_assignment -name VERILOG_FILE ../../../RTL/buffers/RxFifo.v
set_global_assignment -name VERILOG_FILE ../../../RTL/buffers/RxFifoBI.v
set_global_assignment -name VERILOG_FILE ../../../RTL/buffers/TxFifo.v
set_global_assignment -name VERILOG_FILE ../../RTL/wishboneArb.v
set_global_assignment -name VERILOG_FILE ../../RTL/checkLineState.v
set_global_assignment -name VERILOG_FILE ../../RTL/EP0.v
set_global_assignment -name VERILOG_FILE ../../RTL/EP1Mouse.v
set_global_assignment -name VERILOG_FILE ../../RTL/pll_48MHz.v
set_global_assignment -name VERILOG_FILE ../../RTL/usbDevice.v
set_global_assignment -name VERILOG_FILE ../../RTL/usbDevice_define.v
set_global_assignment -name VERILOG_FILE ../../RTL/usbDeviceAlteraTop.v
set_global_assignment -name VERILOG_FILE ../../RTL/usbHostSlaveReg_define.v
set_global_assignment -name VERILOG_FILE ../../RTL/usbROM.v
set_global_assignment -name SDC_FILE usbDeviceAlteraTop.sdc
/altera/usbDeviceAlteraTop.qpf
0,0 → 1,23
# Copyright (C) 1991-2007 Altera Corporation
# Your use of Altera Corporation's design tools, logic functions
# and other software and tools, and its AMPP partner logic
# functions, and any output files from any of the foregoing
# (including device programming or simulation files), and any
# associated documentation or information are expressly subject
# to the terms and conditions of the Altera Program License
# Subscription Agreement, Altera MegaCore Function License
# Agreement, or other applicable license agreement, including,
# without limitation, that your use is for the sole purpose of
# programming logic devices manufactured by Altera and sold by
# Altera or its authorized distributors. Please refer to the
# applicable agreement for further details.
 
 
 
QUARTUS_VERSION = "7.2"
DATE = "13:52:36 August 08, 2008"
 
 
# Revisions
 
PROJECT_REVISION = "usbDeviceAlteraTop"
/altera/usbDeviceAlteraTop.cof
0,0 → 1,17
<?xml version="1.0" encoding="US-ASCII" standalone="yes"?>
<cof>
<eprom_name>NONE</eprom_name>
<output_filename>usbDeviceAlteraTop.rbf</output_filename>
<n_pages>1</n_pages>
<width>1</width>
<mode>0</mode>
<sof_data>
<page_flags>1</page_flags>
<bit0>
<sof_filename>usbDeviceAlteraTop.sof</sof_filename>
</bit0>
</sof_data>
<version>4</version>
<options>
</options>
</cof>
/altera/download.bat
0,0 → 1,3
fpgaConfig -i usbDeviceAlteraTop.rbf -r -a 0 -w -l
pause
 
/altera/usbDeviceAlteraTop.sdc
0,0 → 1,114
## Generated SDC file "cyc_or12_mini_top.sdc"
 
## Copyright (C) 1991-2007 Altera Corporation
## Your use of Altera Corporation's design tools, logic functions
## and other software and tools, and its AMPP partner logic
## functions, and any output files from any of the foregoing
## (including device programming or simulation files), and any
## associated documentation or information are expressly subject
## to the terms and conditions of the Altera Program License
## Subscription Agreement, Altera MegaCore Function License
## Agreement, or other applicable license agreement, including,
## without limitation, that your use is for the sole purpose of
## programming logic devices manufactured by Altera and sold by
## Altera or its authorized distributors. Please refer to the
## applicable agreement for further details.
 
 
## VENDOR "Altera"
## PROGRAM "Quartus II"
## VERSION "Version 7.2 Build 203 02/05/2008 Service Pack 2 SJ Web Edition"
 
## DATE "Fri May 16 09:55:20 2008"
 
##
## DEVICE "EP2C20Q240C8"
##
 
 
#**************************************************************
# Time Information
#**************************************************************
 
set_time_format -unit ns -decimal_places 3
 
 
 
#**************************************************************
# Create Clock
#**************************************************************
 
create_clock -name {clk} -period 20.830 -waveform { 0.000 10.415 } [get_ports {clk}] -add
 
 
#**************************************************************
# Create Generated Clock
#**************************************************************
 
derive_pll_clocks -use_tan_name
 
 
#**************************************************************
# Set Clock Latency
#**************************************************************
 
 
 
#**************************************************************
# Set Clock Uncertainty
#**************************************************************
 
 
 
#**************************************************************
# Set Input Delay
#**************************************************************
 
 
 
#**************************************************************
# Set Output Delay
#**************************************************************
 
 
 
#**************************************************************
# Set Clock Groups
#**************************************************************
 
 
 
#**************************************************************
# Set False Path
#**************************************************************
 
 
 
#**************************************************************
# Set Multicycle Path
#**************************************************************
 
 
 
#**************************************************************
# Set Maximum Delay
#**************************************************************
 
 
 
#**************************************************************
# Set Minimum Delay
#**************************************************************
 
 
 
#**************************************************************
# Set Input Transition
#**************************************************************
 
 
 
#**************************************************************
# Set Load
#**************************************************************
 
/Actel/copyRTLtoActelHDLFolder.bat
0,0 → 1,11
copy /Y ..\..\RTL\*.v usbDeviceActelTop\hdl
copy /Y ..\..\..\RTL\buffers\*.v usbDeviceActelTop\hdl
copy /Y ..\..\..\RTL\busInterface\*.v usbDeviceActelTop\hdl
copy /Y ..\..\..\RTL\hostSlaveMux\hostSlaveMuxBI.v.v usbDeviceActelTop\hdl
copy /Y ..\..\..\RTL\include\*.v usbDeviceActelTop\hdl
copy /Y ..\..\..\RTL\serialInterfaceEngine\*.v usbDeviceActelTop\hdl
copy /Y ..\..\..\RTL\slaveController\*.v usbDeviceActelTop\hdl
copy /Y ..\..\..\RTL\wrapper\usbSlave.v usbDeviceActelTop\hdl
 
pause
 
/Actel/usbDeviceActelTop/usbDeviceActelTop.prj
0,0 → 1,504
KEY LIBERO "8.3"
KEY CAPTURE "8.3.0.22"
KEY DEFAULT_IMPORT_LOC "C:\datasheets\Opencores\usbHostSlave_new\usbhostslave\usbDevice\RTL"
KEY DEFAULT_OPEN_LOC ""
KEY HDLTechnology "VERILOG"
KEY VendorTechnology_Family "IGLOO"
KEY VendorTechnology_Die "IS6X6M2LP"
KEY VendorTechnology_Package "fg256"
KEY ProjectLocation "C:\datasheets\Opencores\usbHostSlave_new\usbhostslave\usbDevice\syn\Actel\usbDeviceActelTop"
KEY SimulationType "VERILOG"
KEY Vendor "Actel"
KEY ActiveRoot "usbDeviceActelTop::work"
LIST REVISIONS
VALUE="Impl1",NUM=1
CURREV=1
ENDLIST
LIST FileManager
VALUE "<project>\constraint\usbDeviceActelTop.pdc,pdc"
STATE="utd"
TIME="1207237677"
SIZE="6506"
ENDFILE
VALUE "<project>\designer\impl1\usbDevice.adb,adb"
STATE="ood"
TIME="1219427579"
SIZE="1078784"
ENDFILE
VALUE "<project>\designer\impl1\usbDeviceActelTop.adb,adb"
STATE="utd"
TIME="1219440016"
SIZE="1136640"
ENDFILE
VALUE "<project>\designer\impl1\usbDeviceActelTop.pdb,pdb"
STATE="utd"
TIME="1219441261"
SIZE="16384"
ENDFILE
VALUE "<project>\designer\impl1\usbDeviceActelTop.stp,stp"
STATE="utd"
TIME="1219441266"
SIZE="293941"
ENDFILE
VALUE "<project>\hdl\checkLineState.v,hdl"
STATE="utd"
TIME="1219425593"
SIZE="6885"
ENDFILE
VALUE "<project>\hdl\dpMem_dc.v,hdl"
STATE="utd"
TIME="1219427411"
SIZE="3862"
ENDFILE
VALUE "<project>\hdl\endpMux.v,hdl"
STATE="utd"
TIME="1219427470"
SIZE="8260"
ENDFILE
VALUE "<project>\hdl\EP0.v,hdl"
STATE="utd"
TIME="1219425593"
SIZE="25833"
ENDFILE
VALUE "<project>\hdl\EP1Mouse.v,hdl"
STATE="utd"
TIME="1219425593"
SIZE="9454"
ENDFILE
VALUE "<project>\hdl\fifoMux.v,hdl"
STATE="utd"
TIME="1219427470"
SIZE="6575"
ENDFILE
VALUE "<project>\hdl\fifoRTL.v,hdl"
STATE="utd"
TIME="1219427411"
SIZE="6307"
ENDFILE
VALUE "<project>\hdl\hostSlaveMuxBI.v,hdl"
STATE="utd"
TIME="1219427436"
SIZE="4931"
ENDFILE
VALUE "<project>\hdl\lineControlUpdate.v,hdl"
STATE="utd"
TIME="1219427458"
SIZE="3451"
ENDFILE
VALUE "<project>\hdl\processRxBit.v,hdl"
STATE="utd"
TIME="1219427458"
SIZE="15071"
ENDFILE
VALUE "<project>\hdl\processRxByte.v,hdl"
STATE="utd"
TIME="1219427458"
SIZE="17214"
ENDFILE
VALUE "<project>\hdl\processTxByte.v,hdl"
STATE="utd"
TIME="1219427458"
SIZE="15227"
ENDFILE
VALUE "<project>\hdl\readUSBWireData.v,hdl"
STATE="utd"
TIME="1219427458"
SIZE="10944"
ENDFILE
VALUE "<project>\hdl\RxFifo.v,hdl"
STATE="utd"
TIME="1219427411"
SIZE="5079"
ENDFILE
VALUE "<project>\hdl\RxFifoBI.v,hdl"
STATE="utd"
TIME="1219427411"
SIZE="5600"
ENDFILE
VALUE "<project>\hdl\sctxportarbiter.v,hdl"
STATE="utd"
TIME="1219427470"
SIZE="7476"
ENDFILE
VALUE "<project>\hdl\siereceiver.v,hdl"
STATE="utd"
TIME="1219427458"
SIZE="9992"
ENDFILE
VALUE "<project>\hdl\SIETransmitter.v,hdl"
STATE="utd"
TIME="1219427458"
SIZE="24223"
ENDFILE
VALUE "<project>\hdl\slavecontroller.v,hdl"
STATE="utd"
TIME="1219427470"
SIZE="17626"
ENDFILE
VALUE "<project>\hdl\slaveDirectcontrol.v,hdl"
STATE="utd"
TIME="1219427470"
SIZE="7433"
ENDFILE
VALUE "<project>\hdl\slaveGetpacket.v,hdl"
STATE="utd"
TIME="1219427470"
SIZE="12832"
ENDFILE
VALUE "<project>\hdl\slaveRxStatusMonitor.v,hdl"
STATE="utd"
TIME="1219427470"
SIZE="3985"
ENDFILE
VALUE "<project>\hdl\slaveSendpacket.v,hdl"
STATE="utd"
TIME="1219427470"
SIZE="9072"
ENDFILE
VALUE "<project>\hdl\timescale.v,hdl"
STATE="utd"
TIME="1219427448"
SIZE="230"
ENDFILE
VALUE "<project>\hdl\TxFifo.v,hdl"
STATE="utd"
TIME="1219427411"
SIZE="5002"
ENDFILE
VALUE "<project>\hdl\TxFifoBI.v,hdl"
STATE="utd"
TIME="1219427411"
SIZE="5596"
ENDFILE
VALUE "<project>\hdl\updateCRC16.v,hdl"
STATE="utd"
TIME="1219427458"
SIZE="4076"
ENDFILE
VALUE "<project>\hdl\updateCRC5.v,hdl"
STATE="utd"
TIME="1219427458"
SIZE="4274"
ENDFILE
VALUE "<project>\hdl\usbConstants_h.v,hdl"
STATE="utd"
TIME="1219427448"
SIZE="706"
ENDFILE
VALUE "<project>\hdl\usbDevice.v,hdl"
STATE="utd"
TIME="1219425593"
SIZE="6821"
ENDFILE
VALUE "<project>\hdl\usbDeviceActelTop.v,hdl"
STATE="utd"
TIME="1219440128"
SIZE="1329"
ENDFILE
VALUE "<project>\hdl\usbDevice_define.v,hdl"
STATE="utd"
TIME="1219425593"
SIZE="1297"
ENDFILE
VALUE "<project>\hdl\usbHostControl_h.v,hdl"
STATE="utd"
TIME="1219427448"
SIZE="2187"
ENDFILE
VALUE "<project>\hdl\usbHostSlaveReg_define.v,hdl"
STATE="utd"
TIME="1219425593"
SIZE="5597"
ENDFILE
VALUE "<project>\hdl\usbHostSlave_h.v,hdl"
STATE="utd"
TIME="1219427448"
SIZE="5297"
ENDFILE
VALUE "<project>\hdl\usbROM.v,hdl"
STATE="utd"
TIME="1219425593"
SIZE="12466"
ENDFILE
VALUE "<project>\hdl\usbSerialInterfaceEngine.v,hdl"
STATE="utd"
TIME="1219427458"
SIZE="11255"
ENDFILE
VALUE "<project>\hdl\usbSerialInterfaceEngine_h.v,hdl"
STATE="utd"
TIME="1219427448"
SIZE="3284"
ENDFILE
VALUE "<project>\hdl\usbSlave.v,hdl"
STATE="utd"
TIME="1219427483"
SIZE="15345"
ENDFILE
VALUE "<project>\hdl\usbSlaveControl.v,hdl"
STATE="utd"
TIME="1219427470"
SIZE="15326"
ENDFILE
VALUE "<project>\hdl\USBSlaveControlBI.v,hdl"
STATE="utd"
TIME="1219427470"
SIZE="24769"
ENDFILE
VALUE "<project>\hdl\usbSlaveControl_h.v,hdl"
STATE="utd"
TIME="1219427448"
SIZE="2718"
ENDFILE
VALUE "<project>\hdl\usbTxWireArbiter.v,hdl"
STATE="utd"
TIME="1219427458"
SIZE="7513"
ENDFILE
VALUE "<project>\hdl\wishboneArb.v,hdl"
STATE="utd"
TIME="1219425593"
SIZE="5708"
ENDFILE
VALUE "<project>\hdl\wishBoneBI.v,hdl"
STATE="utd"
TIME="1219427420"
SIZE="8684"
ENDFILE
VALUE "<project>\hdl\wishBoneBus_h.v,hdl"
STATE="utd"
TIME="1219427448"
SIZE="1041"
ENDFILE
VALUE "<project>\hdl\writeUSBWireData.v,hdl"
STATE="utd"
TIME="1219427458"
SIZE="8542"
ENDFILE
VALUE "<project>\synthesis\usbDevice.edn,syn_edn"
STATE="utd"
TIME="1219427525"
SIZE="3585871"
ENDFILE
VALUE "<project>\synthesis\usbDeviceActelTop.edn,syn_edn"
STATE="utd"
TIME="1219439810"
SIZE="3661567"
ENDFILE
VALUE "<project>\synthesis\usbDeviceActelTop_sdc.sdc,syn_sdc"
STATE="utd"
TIME="1219439810"
SIZE="376"
ENDFILE
VALUE "<project>\synthesis\usbDevice_sdc.sdc,syn_sdc"
STATE="utd"
TIME="1219427525"
SIZE="376"
ENDFILE
ENDLIST
LIST UsedFile
ENDLIST
LIST NewModulesInfo
LIST "usbDevice::work"
FILE "<project>\hdl\usbDevice.v,hdl"
LIST ProjectState5.1
LIST Impl1
LiberoState=Post_Synthesis
ideSYNTHESIS(<project>\synthesis\usbDevice.edn,syn_edn)=StateSuccess
LIST FlowOptions
UsePhySynth=FALSE
UseSynth=TRUE
ENDLIST
Used_File_List
VALUE "<project>\synthesis\usbDevice.edn,syn_edn"
VALUE "<project>\synthesis\usbDevice_sdc.sdc,syn_sdc"
VALUE "<project>\synthesis\usbDevice.v,syn_hdl"
VALUE "<project>\phy_synthesis\usbDevice_palace.edn,palace_edn"
VALUE "<project>\phy_synthesis\usbDevice_palace.gcf,palace_gcf"
VALUE "<project>\phy_synthesis\usbDevice_palace.pdc,palace_pdc"
VALUE "<project>\phy_synthesis\usbDevice_palace.sdc,palace_sdc"
VALUE "<project>\phy_synthesis\usbDevice_palace.v,palace_hdl"
VALUE "<project>\designer\impl1\usbDevice.adb,adb"
VALUE "<project>\designer\impl1\usbDevice.prb,prb"
VALUE "<project>\designer\impl1\usbDevice.stp,stp"
VALUE "<project>\designer\impl1\usbDevice_fp\usbDevice.pro,pro"
ENDUsed_File_List
ENDLIST
ENDLIST
ENDLIST
LIST "usbDeviceActelTop::work"
FILE "<project>\hdl\usbDeviceActelTop.v,hdl"
LIST ProjectState5.1
LIST Impl1
LiberoState=Post_Layout
ideDESIGNER(<project>\designer\impl1\usbDeviceActelTop.adb,adb)=StateSuccess
ideSYNTHESIS(<project>\synthesis\usbDeviceActelTop.edn,syn_edn)=StateSuccess
LIST FlowOptions
UsePhySynth=FALSE
UseSynth=TRUE
ENDLIST
Used_File_List
VALUE "<project>\synthesis\usbDeviceActelTop.edn,syn_edn"
VALUE "<project>\synthesis\usbDeviceActelTop_sdc.sdc,syn_sdc"
VALUE "<project>\synthesis\usbDeviceActelTop.v,syn_hdl"
VALUE "<project>\phy_synthesis\usbDeviceActelTop_palace.edn,palace_edn"
VALUE "<project>\phy_synthesis\usbDeviceActelTop_palace.gcf,palace_gcf"
VALUE "<project>\phy_synthesis\usbDeviceActelTop_palace.pdc,palace_pdc"
VALUE "<project>\phy_synthesis\usbDeviceActelTop_palace.sdc,palace_sdc"
VALUE "<project>\phy_synthesis\usbDeviceActelTop_palace.v,palace_hdl"
VALUE "<project>\designer\impl1\usbDeviceActelTop.adb,adb"
VALUE "<project>\designer\impl1\usbDeviceActelTop.prb,prb"
VALUE "<project>\designer\impl1\usbDeviceActelTop.stp,stp"
VALUE "<project>\designer\impl1\usbDeviceActelTop_fp\usbDeviceActelTop.pro,pro"
ENDUsed_File_List
ENDLIST
ENDLIST
ENDLIST
ENDLIST
LIST AssociatedStimulus
ENDLIST
LIST Other_Association
ENDLIST
LIST SimulationOptions
UseAutomaticDoFile=true
IncludeWaveDo=false
Type=max
RunTime=1000ns
Resolution=1ps
VsimOpt=
EntityName=testbench
TopInstanceName=<top>_0
DoFileName=
DoFileName2=wave.do
DoFileParams=
DisplayDUTWave=false
LogAllSignals=false
DumpVCD=false
VCDFileName=power.vcd
ENDLIST
LIST ModelSimLibPath
UseCustomPath=FALSE
LibraryPath=
ENDLIST
LIST GlobalFlowOptions
GenerateHDLAfterSynthesis=FALSE
GenerateHDLAfterPhySynthesis=FALSE
RunDRCAfterSynthesis=FALSE
UpdateViewDrawIni=TRUE
UpdateModelSimIni=TRUE
NoIOMode=FALSE
GenerateHDLFromSchematic=TRUE
FlashProInputFile=pdb
SmartGenCompileReport=T
ENDLIST
LIST PhySynthesisOptions
ENDLIST
LIST Profiles
Type=CoreConfigurator
Profile=CoreConsole
Tool=CoreConsole v1.3 or later
Location=coreconsole
AdditionalParameter=
Batch=false
EndProfile
Type=Synthesis
Profile=Synplify
Tool=Synplify
Location=C:\Libero\Synplify\Synplify_902A2\bin\Synplify.exe
AdditionalParameter=
Batch=false
EndProfile
Type=Simulation
Profile=ModelSim
Tool=ModelSim
Location=C:\Libero\Model\win32acoem\modelsim.exe
AdditionalParameter=
Batch=false
EndProfile
Type=Stimulus
Profile=WFL
Tool=WFL
Location=C:\Libero\WFL\bin\syncad.exe
AdditionalParameter=-pwflite
Batch=false
EndProfile
Type=PhySynthesis
Profile=
Tool=
Location=
AdditionalParameter=
Batch=false
EndProfile
Type=Program
Profile=FlashPro
Tool=FlashPro
Location=C:\Libero\FlashPro\bin\FlashPro.exe
AdditionalParameter=
Batch=false
EndProfile
ENDLIST
LIST ProjectState5.1
LIST "usbDevice::work"
LIST Impl1
LiberoState=Post_Synthesis
ideSYNTHESIS(<project>\synthesis\usbDevice.edn,syn_edn)=StateSuccess
LIST FlowOptions
UsePhySynth=FALSE
UseSynth=TRUE
ENDLIST
Used_File_List
VALUE "<project>\synthesis\usbDevice.edn,syn_edn"
VALUE "<project>\synthesis\usbDevice_sdc.sdc,syn_sdc"
VALUE "<project>\synthesis\usbDevice.v,syn_hdl"
VALUE "<project>\phy_synthesis\usbDevice_palace.edn,palace_edn"
VALUE "<project>\phy_synthesis\usbDevice_palace.gcf,palace_gcf"
VALUE "<project>\phy_synthesis\usbDevice_palace.pdc,palace_pdc"
VALUE "<project>\phy_synthesis\usbDevice_palace.sdc,palace_sdc"
VALUE "<project>\phy_synthesis\usbDevice_palace.v,palace_hdl"
VALUE "<project>\designer\impl1\usbDevice.adb,adb"
VALUE "<project>\designer\impl1\usbDevice.prb,prb"
VALUE "<project>\designer\impl1\usbDevice.stp,stp"
VALUE "<project>\designer\impl1\usbDevice_fp\usbDevice.pro,pro"
ENDUsed_File_List
ENDLIST
ENDLIST
LIST "usbDeviceActelTop::work"
LIST Impl1
LiberoState=Post_Layout
ideDESIGNER(<project>\designer\impl1\usbDeviceActelTop.adb,adb)=StateSuccess
ideSYNTHESIS(<project>\synthesis\usbDeviceActelTop.edn,syn_edn)=StateSuccess
LIST FlowOptions
UsePhySynth=FALSE
UseSynth=TRUE
ENDLIST
Used_File_List
VALUE "<project>\synthesis\usbDeviceActelTop.edn,syn_edn"
VALUE "<project>\synthesis\usbDeviceActelTop_sdc.sdc,syn_sdc"
VALUE "<project>\synthesis\usbDeviceActelTop.v,syn_hdl"
VALUE "<project>\phy_synthesis\usbDeviceActelTop_palace.edn,palace_edn"
VALUE "<project>\phy_synthesis\usbDeviceActelTop_palace.gcf,palace_gcf"
VALUE "<project>\phy_synthesis\usbDeviceActelTop_palace.pdc,palace_pdc"
VALUE "<project>\phy_synthesis\usbDeviceActelTop_palace.sdc,palace_sdc"
VALUE "<project>\phy_synthesis\usbDeviceActelTop_palace.v,palace_hdl"
VALUE "<project>\designer\impl1\usbDeviceActelTop.adb,adb"
VALUE "<project>\designer\impl1\usbDeviceActelTop.prb,prb"
VALUE "<project>\designer\impl1\usbDeviceActelTop.stp,stp"
VALUE "<project>\designer\impl1\usbDeviceActelTop_fp\usbDeviceActelTop.pro,pro"
ENDUsed_File_List
ENDLIST
ENDLIST
ENDLIST
LIST ExcludePackageForSimulation
ENDLIST
LIST ExcludePackageForSynthesis
ENDLIST
LIST IncludeModuleForSimulation
ENDLIST
LIST CDBOrder
ENDLIST
LIST UserCustomizedFileList
ENDLIST
LIST OpenedFileList
DESIGNFLOW:
ACTIVE_VIEW:0
ENDLIST
/Actel/usbDeviceActelTop/designer/impl1/usbDeviceActelTop.ide_des
0,0 → 1,19
KEY IDE_DES_TOOL "Designer"
KEY IDE_DES_FAMILY "IGLOO"
KEY IDE_DES_DIE "IS6X6M2LP"
KEY IDE_DES_PACKAGE "fg256"
KEY IDE_DES_TOP_CELL_NAME "usbDeviceActelTop"
KEY IDE_DES_KEEP_PHY_CONSTR "FALSE"
KEY IDE_DES_KEEP_TIME_CONSTR "TRUE"
KEY IDE_DES_LAYOUT_DONE "TRUE"
KEY IDE_DES_BA_EXPORTED "FALSE"
KEY IDE_DES_ERROR_FOUND "FALSE"
KEY IDE_DES_ADB_PATH "C:\datasheets\Opencores\usbHostSlave_new\usbhostslave\usbDevice\syn\Actel\usbDeviceActelTop\designer\impl1\usbDeviceActelTop.adb"
LIST SOURCE_FILES
VALUE "C:\datasheets\Opencores\usbHostSlave_new\usbhostslave\usbDevice\syn\Actel\usbDeviceActelTop\synthesis\usbDeviceActelTop.edn;edn"
VALUE "C:\datasheets\Opencores\usbHostSlave_new\usbhostslave\usbDevice\syn\Actel\usbDeviceActelTop\synthesis\usbDeviceActelTop_sdc.sdc;sdc"
VALUE "C:\datasheets\Opencores\usbHostSlave_new\usbhostslave\usbDevice\syn\Actel\usbDeviceActelTop\constraint\usbDeviceActelTop.pdc;pdc"
ENDLIST
LIST OPTIONAL_FILES
VALUE "C:\datasheets\Opencores\usbHostSlave_new\usbhostslave\usbDevice\syn\Actel\usbDeviceActelTop\synthesis\usbDeviceActelTop_sdc.sdc;Used"
ENDLIST
/Actel/usbDeviceActelTop/designer/impl1/usbDeviceActelTop.tcl
0,0 → 1,8
# Created by Libero Project Manager 8.3.0.22
# Fri Aug 22 14:28:19 2008
 
# (OPEN DESIGN)
 
 
# set default back-annotation base-name
set_defvar "BA_NAME" "usbDeviceActelTop_ba"
/Actel/usbDeviceActelTop/designer/impl1/usbDeviceActelTop.pdb Cannot display: file marked as a binary type. svn:mime-type = application/octet-stream
Actel/usbDeviceActelTop/designer/impl1/usbDeviceActelTop.pdb Property changes : Added: svn:mime-type ## -0,0 +1 ## +application/octet-stream \ No newline at end of property Index: Actel/usbDeviceActelTop/designer/impl1/usbDeviceActelTop.adb =================================================================== Cannot display: file marked as a binary type. svn:mime-type = application/octet-stream Index: Actel/usbDeviceActelTop/designer/impl1/usbDeviceActelTop.adb =================================================================== --- Actel/usbDeviceActelTop/designer/impl1/usbDeviceActelTop.adb (nonexistent) +++ Actel/usbDeviceActelTop/designer/impl1/usbDeviceActelTop.adb (revision 40)
Actel/usbDeviceActelTop/designer/impl1/usbDeviceActelTop.adb Property changes : Added: svn:mime-type ## -0,0 +1 ## +application/octet-stream \ No newline at end of property Index: Actel/usbDeviceActelTop/designer/impl1/usbDeviceActelTop.stp =================================================================== --- Actel/usbDeviceActelTop/designer/impl1/usbDeviceActelTop.stp (nonexistent) +++ Actel/usbDeviceActelTop/designer/impl1/usbDeviceActelTop.stp (revision 40) @@ -0,0 +1,4349 @@ +NOTE "CREATOR" "Designer Version: 8.3.0.22"; +NOTE "CAPTURE" "8.3.0.22"; +NOTE "DEVICE" "AGL600V5"; +NOTE "PACKAGE" "AGL600V5-fg256"; +NOTE "DATE" "2008/08/22"; +NOTE "STAPL_VERSION" "JESD71"; +NOTE "IDCODE" "03b261cf"; +NOTE "DESIGN" "usbDeviceActelTop"; +NOTE "CHECKSUM" "E537"; +NOTE "SECURITY" "Disable"; +NOTE "ALG_VERSION" "17"; +NOTE "MAP_VERSION" "1"; +NOTE "TOOL_VERSION" "1"; +NOTE "MAX_FREQ" "10000000"; +NOTE "SILSIG" "00000000"; +NOTE "TRACKING_SAR" "72850"; +NOTE "SPEED_GRAD" "STD"; +NOTE "TEMP_GRAD" "COM"; +NOTE "PRG_BSR_SET_IO" "Z"; + +ACTION PROGRAM = + W_INITIALIZE, + DO_ERASE, + DO_PROGRAM, + DO_VERIFY_BOL, + DO_PROGRAM_RLOCK, + DO_EXIT; +ACTION PROGRAM_ARRAY = + AW_INITIALIZE, + DO_ERASE_ARRAY, + DO_PROGRAM, + DO_VERIFY_BOL, + DO_PROGRAM_RLOCK, + DO_EXIT; +ACTION ERASE_ARRAY = + AW_INITIALIZE, + DO_ERASE_ARRAY_ONLY, + DO_EXIT; +ACTION ERASE = + W_INITIALIZE, + DO_ERASE_ONLY, + DO_EXIT; +ACTION ERASE_ALL = + INITIALIZE, + DO_ERASE_ALL, + DO_EXIT; +ACTION VERIFY = + R_INITIALIZE, + DO_VERIFY_EOL, + DO_EXIT; +ACTION VERIFY_ARRAY = + AR_INITIALIZE, + DO_VERIFY_EOL, + DO_EXIT; +ACTION READ_IDCODE = + DO_READ_IDCODE; +ACTION VERIFY_DEVICE_INFO = + READ_INITIALIZE, + READ_IDCODE_ONLY, + DO_VERIFY_DEVICE_INFO, + DO_EXIT; +ACTION DEVICE_INFO = + READ_INITIALIZE, + READ_IDCODE_ONLY, + DO_DEVICE_INFO, + DO_QUERY_SECURITY, + DO_EXIT; + + + +DATA CONSTBLOCK; + INTEGER IEEE1532=0; + INTEGER STAPL=1; + INTEGER DIRECTC=2; + INTEGER PDB=3; + INTEGER SVF=4; + INTEGER FP=0; + INTEGER FPLITE=1; + INTEGER FP3=2; + INTEGER SCULPTW=3; + INTEGER BPW=4; + INTEGER DIRECTCP=5; + INTEGER STP=6; + INTEGER FP33=0; + INTEGER FP34=1; + INTEGER FP40=2; + INTEGER FP41=3; + INTEGER FP42=4; + INTEGER FP50=5; + INTEGER FP51=6; + INTEGER FP60=7; + INTEGER FP61=8; + INTEGER FP62=9; + INTEGER UNKNOWN=127; + INTEGER UNSPECIFIED=0; + INTEGER QN132=1; + INTEGER VQ100=2; + INTEGER TQ144=3; + INTEGER PQ208=4; + INTEGER FG144=5; + INTEGER FG256=6; + INTEGER FG484=7; + INTEGER FG676=8; + INTEGER FG896=9; + INTEGER QN108=10; + INTEGER QN180=11; + INTEGER TQ100=12; + INTEGER CQ208=13; + INTEGER FG1152=14; + INTEGER BG456=15; + INTEGER UNDEFINED=63; + INTEGER GRADE_UNSPEC=0; + INTEGER GRADE_1=1; + INTEGER GRADE_2=2; + INTEGER GRADE_3=3; + INTEGER GRADE_F=4; + INTEGER GRADE_STD=5; + INTEGER GRADE_4=6; + INTEGER GRADE_UNDEF=7; +ENDDATA; + +DATA PARAMETERS; + INTEGER FREQ =4; +ENDDATA; + +DATA GV; + INTEGER ULOPT1_BITLOCATION =11; + INTEGER ULOPT0_BITLOCATION =10; + INTEGER ULUWE_BITLOCATION =9; + INTEGER ULARE_BITLOCATION =8; + INTEGER ULUPC_BITLOCATION =7; + INTEGER ULUFE_BITLOCATION =6; + INTEGER ULUFP_BITLOCATION =5; + INTEGER ULUFJ_BITLOCATION =4; + INTEGER ULFLR_BITLOCATION =3; + INTEGER ULULR_BITLOCATION =2; + INTEGER ULAWE_BITLOCATION =1; + INTEGER ULARD_BITLOCATION =0; + BOOLEAN BUFF128[128]; + BOOLEAN BUFF32[32]; + INTEGER I; + INTEGER J; + INTEGER TEMP; + INTEGER SDNUMBER; + INTEGER ROWNUMBER; + INTEGER DATAINDEX =0; + INTEGER FROMROWNUMBER =1; + INTEGER AESBLOCK; + BOOLEAN ID[32]; + BOOLEAN PASS = 1; + BOOLEAN FADDR[3]; + INTEGER STATUS =0; + BOOLEAN SILSIG[32] = $00000000; + BOOLEAN ISC_CONFIG_RESULT[18]; + BOOLEAN VERIFYEOL[2]; + BOOLEAN COMBERASESELECT[23]; + BOOLEAN SECKEY_OK = 1; + BOOLEAN SECREG[44]; + BOOLEAN ULUWE = 0; + BOOLEAN ULARE = 0; + BOOLEAN ULUPC = 0; + BOOLEAN ULUFE = 0; + BOOLEAN ULUFP = 0; + BOOLEAN ULUFJ = 0; + BOOLEAN ULFLR = 0; + BOOLEAN ULULR = 0; + BOOLEAN ULAWE = 0; + BOOLEAN ULARD = 0; + BOOLEAN ULOPT[2]; + BOOLEAN SUROWCHECKSUM[16]; + INTEGER SUROWCYCLECOUNT =0; + INTEGER ACT_UROW_CYCLE_COUNT =0; + BOOLEAN ACT_UROW_DESIGN_NAME[70] = $2be746469b7978e9c1; + BOOLEAN SUROWDESIGNNAME[70]; + BOOLEAN SUROWPROGMETHOD[3]; + BOOLEAN ACT_UROW_ALGO_VERSION[7] = $11; + BOOLEAN SUROWALGOVERSION[7]; + BOOLEAN SUROW_PKG_TYPE[6]; + BOOLEAN ACT_UROW_SW_VERSION[7]; + BOOLEAN SUROW_SW_VERSION[7]; + INTEGER PLAYERVERSIONVARIABLE =0; + INTEGER SCULPTORMAJORBASE =4; + INTEGER SCULPTORMINORBASE =50; + INTEGER PLAYER_VERSION_VARIABLE =0; + INTEGER SCULPTOR_MAJOR_BASE =4; + INTEGER SCULPTOR_MINOR_BASE =50; + BOOLEAN ACT_UROW_PROGRAM_SW[4] = $f; + BOOLEAN SUROWPROGRAMSW[4]; + BOOLEAN SUROW_SPEED_GRADE[3]; + BOOLEAN SUROW_SRAM_DISTURB[1]; + BOOLEAN ISERASEONLY = 0; + BOOLEAN ISRESTOREDESIGN = 0; + BOOLEAN FLAGDISPLAYCYC = 0; + BOOLEAN BSRPATTERN[1056] = $924924924924924924924924924924924924924924924924 + 924924924924924924924924924924924924924924924924924924924924924924924924 + 924924924924924924924924924924924924924924924924924924924924924924924924 + 924924924924924924924924924924924924924924924924924924924924924924924924 + ; + BOOLEAN SAMPLEMASK[1056] = $000000000000000000000000000000000000000000000000 + 000000000000000000000000000000000000000000000000000000000000000000000000 + 000000000000000000000000000000000000000000000000000000000000000000000000 + 000000000000000000000000000000000000000000000000000000000000000000000000 + ; + BOOLEAN RLOCK[1248] = $7fffffcffffffbfffffeffffffbfffffefffffffffffffffffff3 + fffffcffffff3fffffcffffff3fffffcffffff3fffffdffffff3fffffcffffff3fffffcf + fffff3fffffcffffff3fffffdffffff3fffffcffffff3fffffcffffff3fffffcffffff3f + ffffdffffff3fffffcffffff3fffffcffffff3fffffcffffff3fffffdfffffffffffffff + fffffffffffffffffffffffffffffffffffffffffff; + BOOLEAN ARRAYRONLY = 1; + BOOLEAN CHKARRAY = 0; + BOOLEAN FROMRONLY = 1; + BOOLEAN CHKFROM = 0; + BOOLEAN CHKNVM = 0; + BOOLEAN CHKSEC = 1; + BOOLEAN PERMLOCK = 0; + INTEGER HEX[16] = 70,69,68,67,66,65,57,56,55,54,53,52,51,50,49,48; + INTEGER NUMBEROFFROMROWS =8; + BOOLEAN INITIALIZE_DATA[5] = $00; + INTEGER SDTILE; + INTEGER NUMBEROFSDTILES =6; + INTEGER NUMBEROFMAPROWS =3444; + INTEGER IDREV; + INTEGER IDFAB; + INTEGER BM7DEVICE =0; + INTEGER BM1DEVICE =0; + BOOLEAN M1BUFF[128] = $acdd6548ccb488863e291eb18fe95077; + BOOLEAN M7BUFF[128] = $e137623a2eeee91126015f3f73664945; + BOOLEAN IDCODEVALUE[32] = $03b261cf; + BOOLEAN IDMASK[32] = $06ffffff; + INTEGER SECKEYCHK =0; + INTEGER DESIGNPKGTYPE =6; + BOOLEAN ACT_UROW_PROG_METHOD[3] = $1; + INTEGER LABEL_SEPARATOR =0; +ENDDATA; + +DATA BITSTREAM; + BOOLEAN UROW[128]; + BOOLEAN UROW_MASK[128] = $fffffffffffffffffffffffffe01ffc0; + BOOLEAN DATASTREAM[4298112] = @mA320000110040W0W000020G000400108002200000Ww0 + rssso0000p@@lF999IjjjQp0000_@x@@IYaatcjD50000y_@V3HIIIORRRR36eXaa49jjDR1 + 0000@x_@HIg11I30000yxxt7Ig69u@@VCDCK3Wm61000_@V1H0vssMj90008@@z@69HIo000 + 049IIICIII2761000Gaaa0Yaa4O3CGaaa4XaaaQu0aaaaWaaag1g0Oaa89Wa4910GDy0IIII + 10000100602WaaaC16a47q570000GIIIID8dsssMssssS899H9000ejjLRkjDRpIIaa7000u + sijjqgjj4HIII00000RRRRORRB1aaayU8e6G0sMMaQW2ossWg1Aejj59DiGDW4sORRssba89 + 7000mskWKWaaa4P0000B99Hoba89dscjTc499RIaaa9IIIiPRRxHIIIMIIIY899HWjjjQ899 + HZaa89IIYCHRhsMIIaqIIaaa85IMYPRRRGQIQIDW0A98qijjb8D99a6AGIYjTQW0a899IYaa + 89qsc68e6uX9999kjjjw899HcaaKG8Gssscjaaa8B10999JT4WaaaurPGnYWSb1899f90008 + GIIY90000GIIa600r02W00000IQYa00000a89110000aC9D100W0G6IMoHpWQ01T2LK3S109 + 9fQ07wTCeOXW103g1EeohWQ02Qo800004100WQW30000M2jmSG1r0408000010HM44f19q85 + HDm5H3CKGiWQRRRE9991Q70jjjLWaa4X00W922KRRRSCT00000ijj5fRAeMqMETJ1iXjfYaa + a8080K3KWssMeqW5ORaaa6aGD07OIIIIvEe6G1QRRRmsssS999Hi@@t@sscjZjDRRIIaam@z + @FRN3GWsZa499y@_@7Rrssqgjz6HIIISDm1cjl9h1KWRRBYaaaOV@@Ff15ej999DGXQW2w4G + e6O3LIII4@@@zjjjPpQRhWW04@@@_GRRrMRRpsijLRxlDRRtMjjTtijjNrss6pssssssscss + sMJRRRMQRRLYjjPRijLppsMD01IORRrMRVpqejLRBjCRPnMjjDskjjPrss6poss8DmWQ02ij + jja6KGDG1ijjDg10nssscvssMjRRRsCRRrsljL3GWz000040030OK3C3920Wm83I3ie60XHr + 3Y62fs2X10BY6S8LmX10FQo8O08b2YB4000K3eHf2bg1uHFYD60uwa1MAHu0a00W10AKVgWE + 1LqbgWQ1ZS7OYJ044qWaGA445W1100Iv4keJm3v48u4m1fEwO9n8vRiuf1ObNwAEn1H3cgpW + 1pXS8AI1fEQ88G3r0E85m1TFSeJG42000pZuHgZDo9aHsZ6MFHHEX9EIzG402o9SGm9RsqWH + 33EUSiGQ0AchCHmfIY1Um0WAp9mmFDM60aLQjFxiXtN15wHK5400WnCQe6W3MqOYQ0iuH22Y + 60301G0LJeGu4Ba6G3J0Kme8CqMm6XQuGB7Ba6G2lSPmXIBaJW6l3KGE1HSBaX1dSN48B4ua + DJ6Lo00FaJ06DFyGI956S2QHAWGD05C2M5fE4IkBJ4S2AF3T0200WUWweiCMc48ZV2M8uaZA + 9XZQ0OFj6EYwWYA188mZKUReWu7Q89f6g18XWwW59B99I2IIeaaa8899HMIIY4ba09199ImI + IWa89GIIIaaaW8899GIIIYiaa489992IIYaaaa81IIA5020IIIM3012GIIg1e0aaaar0GGcc + 4a6m1IGIKg1m08999f1GGD09K701r0KG304K3m154iGQ058B99H2aiKE1FK302Iaaa8999H2 + GIAd04WWaa8899JIII2489fe1Ae603aaaaaJ03aaaa8889L3m1O199HGGIM3W2f1Km806K30 + 4v4GHWJz6JtNPO4o@GOaWWDT6GHJWe4S2oN3PpU0p4SoFf2mG22aKj341d8JX740IKIAHaBo + A1XsF8WWa4K88Ga8I5r0WW4aaaQ0k8DW92EfYQ0A0299PE1Oq9m2bae0199f6JK0981PR1jG + GIIAd0JALmWXhNeXXDMqPXQ0S8w36I3u1G2001FAHH9GqAX6L3R08999I1009FG02000Gaaa + zbVGOoACxi1LAVGD0KLGW45NKm99D0102O502404GSL24WGW06GuYeCEOEW209004b018080 + Y8Y0G0G0r0KW8W0Wf1Cu5W2G202008WG800mnBL0100eB02aaWaO00W6GIIYS0012A99I20W + 09ca09H00W4Wa199040CGaaa41222GQII21919091D2W4W5zGW08000f99I4400Wqc892I00 + 0QZa409000If1G0e0Ipq0AWacaKQ04W6a48D028891e0W0Yaaa8mGG0IIII8O981898L301I + IIIC000KGG100G9HII0000miJw4C999G1000ea4481004KI240000I49H2G000049GIGW248 + GGG00100aN9CG0I020200H2IIr0KGG3504Wai6W22QmWq080W0GWWW0e_c88DW6w48XQ0QeW + 02aa2000G99wX2KIIIEn01IIIIGII2_KU1aW20wVWWo080GII0C0000G6I45000081H22000 + 0aGg550809Oey2eaa0K301DYNW4WaaQ0AuLZ2G2I2c6m58393h1W0H9H1r0Km904q902P4K0 + GIIo22C0920mY24830000aa4H30WS2801000WIIoE180HIIGE14W4a4i602o9W289P0v4O1o + KImQ08eW03a8a8a603T2aHB@6KWH10A99x4W04999v4Gm00FrMa63QmGdqjC2g8bcovEXKDu + PJh4iHiBDyKKFvyPnf06KW05bEGmI480m008Bb9sW01400835q0G0WWr8U88W2I3qaS2A8G0 + 3o9eYL0AeR26oB8YghU0A00080008004dMunW5F4_ga54CIg7AKN6BjImK05tyAI2n5KIvdS + W000eo15Adma_ao0410GiAOKtzEH1CHmmTzxWGzz1JS24G080eeZ5A48X44SeKxKYZBherWf + x682g3dQ1FBrXP0210iHJ5bpkm504aiC598e1401000011eXHqqGKiYWt8rq0036Kt5NEjMg + 3KDFX4jKOmk6XKSGAj5mKE1sKGmBjwSmX33zPHFj5KGkAB0808eZhSkIncGTwO7W6cGZXy1Q + e0X9YL8XS0OuQ0CcB8ZK7S9eW2o4u0G010F2OoY2EKH03tGOpr69q263XlgR4Sfida6HTOIe + rQA91BfqK2O909HIooYa4e4999AMMI6fgQWIIIog49u4s2ILrW8NBe604gJrWQ080D19PGg6 + 889Bf6W2MNa09P99rfk0aai499D8LNZGQ0Cq9G1Xlg1KIoI4aaW8BB9HY2IcJG144a4B4WWe + 18004aKviS8998f6028199L3m12IIGQhs09O991so0899fq0O89s72j_jI6V8zK3gfeYaa_u + u3BG000SfYAzGQJBBhSH06pgSWa0000200l7yGQ0AyJm2R70HQ0E4lG4LXeo12IaJW2hHoHS + 0CqDm3v4yHVIk5gpI30O2a00WS2Khm340919LuH14IIIIZ_WjF8GGI2I99Bq_X18D1II4n09 + B91zYO0WaaaEfPW0Wa49989G2IIzYGGA_ISJ21Wa4aI4PaE1C0A99HD06al212IIIoNfWp18 + W4WaKR14W4WW4089PD044N21v40Hz9BCF01LNVG304K301@LNGQ050991HGIImRA54S2Ad6H + Ju4e5QjBIMIIQhk49B100W0I2wj00aaaQ100g101iaa4f1GWia400000oIIIA8O30I2019G0 + G20WiBG020aKV040919f4028181K0218090w3eWtI80I20GD05a3Y1b7Kmom5a6G7r0aHerR + G206uYv2W3000G99fE02W990qP2120204000CKy1f2OmE980II2uxu48189LVY1H3GGQ0RK3 + G6XM@HdqAWWIIYi00Gdq50008GabaLT370G0G0999Ria48P991G00Gg3A0G20eE020200KHE + 7O1000Iaa8910080oYaa002049oII082G28R999qQEQVf09914XMZ0G0Ioqe90240KD05809 + 0evv60800W0Wai6W2IZMYq0A0WW40900102G2W40001011G2G0a04Gd0N4Qz7WC00wak1WGa + a09300024K3m2f8S00a449080h9HGD0IaJW1f1G00199II0204Wa89900202WaWaGE14q9W5 + XMJoM8YS7p9BSbHXEhC0WD4040s3KbqakAVWCsOHdu4EO_NbcO0X6m1yh16_OGYU2oO602wK + 8Xu0Aegf3IltWkAgOFXMk3WWS2OOkYNgUeYS2s8m9hobQklsfAf2ZIBGYLsg02m0G304SMW5 + pfGGEMMiBX2d2qGv7c8020OY08o9uWGhVePW2o9mWHAeOxN4o90ZCdTe7x72dGM4400T64X0 + 00WM08eanX0200M3W3r10Hq0dKvR4THMKerxKbG1X@3HerBM3G502002DGXANWew0C0801ag + Q61S6pW0808108F02EcgWZ8C0G0WmY2A020Wu56FU8uWXHS0600GA09G040uDY5Qhvaz1A8c + 02kSGZb7u0W00mL9OCGW17kipL55arX193aol59a2m1ZCKX00020080020WN5m2C000DciI8 + 474T03PIX050000004JDp0300WR6gO764YEe1W0W0T2e0800W80Au2AKoNP40204V1KnXuNK + FG473uGkT6KGGBvGOnt4A4uJ3DKqmUX7C0m7W4W4U3GXfsAeZ2HG008K9aEvW41810mV0m8H + iCYJe2X000r0emT0Jqzn9F10Hb0CCRY4j78Hg3OyFm4x1em_OlG000wE_dgDOXT7C8d03400 + 4itm59leX40mW0BO8BY5wvX6G000bAWHL5PCAM8VjGHW5JSNG2Xwa1G80WQ0kOeX4A2W0G80 + 0JYAIhuDa5G3XMBJqq4GIK2gqK20MIMY4ba4F1B9Im2oGhDGoI2Isf4GQII2aWW599BeWLB8 + qw9gJD193O9IKIGaa448189H2IIMtg5WCbaCqw3I3uXGhFHGIGGD04m2IKYWa4C999hS2AeW + Q329eWYM9WWa4K9044QD4XlsWabaa6QBuWM3o9W0099PMIIIIGWWq08G22IWaaqaS2Euyr22 + jMaYoieXX5INuXOBK9403Y6uWw9SW00WGerb0G000G80mS5E0200ui020aW08100OF040IW0 + iIm5j4yGd08S801r2mGJ6FKiV8n_vm5i4yJm102016Fu010W0hYIGmHiK0Q1b4WGE9C0H00O + 8a2EBOXZ2gOpX7cvWWe0GOeW28404KC_1NfIGU8WaIZ6r1OGE16Slm1VJPG4H1TRr2x6vH2F + NCCG1G0002rnbE1A8d0DwXeXQ1C8XpSc3WZGhj8642IZEX2FC0PP9OY84iTR1rFNm1q4098D + H022WaaW41GIIrtZ0Waa49999G0II4aaa0998H2aqKl8902IIY0aW49918IGMIaa40GmGI2W + 0W4899962I2W4aa810100GYU401XMp1aaW4919AI0I0aaWa9998X2IIWWaa8P99eQa4W8898 + HGGIOLs244aa098900G02aaWaS2A8ua8OIII6QD1W4Wa89091G2Ig602002IYaWW4H999I20 + ap1A0898962Ion080I3IYWWbaS2y8K13ALeWkO3hy2OW9iW9RRRpmG4WhjjFBH0PWWssijX4 + m08Rpo_v8058PsMs0G00WPTRR0W040ljzDPW020spsi10G0GssgjXWW00Rhos00W00jQRR10 + 000gjlj1040aijjT31814ssty10806QRpM20C02iDPB3000WiPRR30020cjjj1G00Wq0Gmss + 0GD0700ejLRR1GD05m0000ajjDxCf1RYa0817oeDGIYaC2p26292G25B3Bb00B90JRP3B8PH + abjDZaX49K6Me5IG4aGBpm68J2IOh6s69IGIiQBRZ89B9ejjj5aaa4HMsMDIIIamsmi9I2Y4 + ORrs099I2eDJR8ae8HHiXiCYKbyWjjjDaaa4nsssCIJIaGJRpM88HIYbDPRa499Xjr0KWSRR + R6999T2S0rssMTIIIaO89qo1f228i5Qum011LK4i4I4WaSH0ti9SIALLsqc2I2IGRORMC19H + 2jk1RWq48HccbDGGacmsiijIaaaGossM02IIoj04CL01ms891I2RJt6AHII09xIZ18188iji + r@8W0jizHaaa4ijjjfaaa4qscc5IIGaOPRJ5KWtsseQ0Cm9999ejjDxaaa8rsscAO1WW00E9 + f9X0000as44j0000oJQc60G80gfnJX4000gHIQ220000f89900000caY80001G2JII54eaac + Sgw2e990000GAfx20qqW810G00ba690080GGIc4600088HII30004a9jfXfgJObv3I3W0200 + Gqac40000uaaaiW02aaaa64W120000baa8XhFpdGJ2aazD@R90oIWtiv@6818Wpcw@34445p + rt@0aaW8z@VxHYIY4@xl@P89K2y@U_XC899@xx@X4989ht@@Ha4a4_@x@HIII2_@@t38O9I_ + VU@291IMsVjVYa093_tyFJYaa0UVyF3G2GGy@@@3IIIYyzll7999Iyz@f1KW_@@11989r0SW + @@@Jaaa4_@@@PIII2_@@t7999IG0O0KRJsMe4GGXfPRpm0iWmcjjl8m4mKyqr4X0W2eqscc8 + O000QQRse0W2WjfPR0K04WsaDj00W0eMjjjG0G00rsqs00000RRRhWW800jjjQ1000IjjPRX + 0011scij10800Vs_cW0810PRQJ1000WQRRR2001@NS0stsM1001f1OGD06CZ11i300w4W050 + 00WQRRh1WWpMMeSc2YbvXQOQOuKQENpZw029W03wNMfA1MeGdAsRxapsOvtDPM8WWs0O8iM4 + g4Ubj0CeF134000yQG240006qWWG7IG0G0ul074b54V38HVd60802eJ02U_fYQ0A8CcJk2eW + LrNO0WkIOuaWXHOnI20K20iUX3jahJE1j4Cy75BeW010eXMH04C0mU4B08G0euT8o0uWz0Ee + yI46@uXz6o8FFGITmXHeyeNrCIRNf9Ba0W02oq14ST022220g901G00816G0W00WHQBOm22c + lmWk7Wu335g1WWwe9eH14MleWOHGe8158080K61820W0G000cJW1ddYGE16800G8d04soDXS + 2C8Y02o9mYQ0G8d09oBuWS2c8eEDg1mXqUF8_j3QFCaocv933IEjtXX4AebE4s0eWCJKG0G0 + Gv4NCfm2@oyGZ9CipX3r0aGR1P0a00uLW4EQJZQ0kuNZEg5EbGh@ujF3gvnZp4Mek1J0200a + 6G8DK4nhVD8881e6W2K000S1Y1@4amm95yam4POOG22hqNH6PDMIy6FWa80Oka8W000W200y + P6Ig1fY7AMeQ9KMJ920140xjrJh@5C00182806DY84200L5a0402Wn9n8fZBoKm210401g3K + 1u6yzJ1NfKGRr8iwG16040ArUXFL8e_34c2fXP1SORoCohQYbGA8l2FG000aJG2@L0o72XiI + UDn9KHK3780208bhCUy_W@0cOF03kl8YIHBOHoLkJeZkcSO6HVw3mc0dy85x7YlGXj1A1800 + G7478081OCfEUlrY1tIPA0Cgt8bT2Wut09MfmayYGeUW5o1lWJ1Yea23_Fn01080dE8ow4FC + iB65512010WiSNG000KlECCzJ1b_ZGIEDanq2VXGHk3ISWN6jLhHD050408iZW3A4W0G0004 + 802_N0YY3Ge603w6GXq5GOD82w@7YI0OufbBo9m2aXWaA199bGGI20aa4P90Rff48031HMII + 24999GMIIa4aW8919UeQ1GIIM4WaW89998qQ7iaaa0989H0IIYa4a49GMoai4a8G89bgA1O9 + 99H2IoYa0a4AB9O2s90999GGIGYa4a4e9985KhGerNWi4W49C99K2II0aaa0A9OHYIAWaWi4 + 1P98IGa0999fGIIGQukWMNFG0GIGd04K301v4m0Waaae1E0P939IG22WaWa1TRG5i6Wbba41 + 1GYWaa4f998XMNGuh5ajD3XM@Hh26y1130300IgGYh9GelYCgr8Xt0a82Y2cpgYaasO1Y2Ip + hWu0Eet46k10X10exAX2K00WqNG109006CeWNxL0420oCr402040G00G2y6qF32PSGH47Eie + F8G001YweZU0EOA13U12XZ1M8d04gkkXS2SuAd5I1WW2nD8d0J2jce@WfQ8WI0824aO92RWb + mf15SVZ102026ImWXICe603QDXXc4Cuka3I3OZQ0o8qQCacaa819Hf__2Ay01MIoMa4a4pzm + 0Wbaa8081QhkWsFG8DQB21H1I0IIcaWag181oIIIHw71B91fQ0C0aaaGerR0199f602o901A + 8992o2IibcaeHIIAj420MIGYWa48d03IocWe180899PE1D4S21v4i0819fGhF8dWF03995S2 + 8bASGh2DqKH5jKGJh674EHD0qYCajjjOO330ssscjWb1GIRRstaciiajPRx4421qjBRRE4W1 + GijbDSC020M_sc8411WRRVs80C5KJWv1O00vRPs04Gofk0280mAxRR009X8RRRt00z0XjbER + 00GXMN0GA0Gj@iDjLdGer4qMj1XM72BGJO8C0Pm9CbO4048X66c90224K22qG19020OKcs0H + KG2K83R81821ei5iuCaW8mccg12GW4msaj1I2a4GRmsG8nI24PPRX0999Yifj1i4a4iD9zXa + GY8sM86HIcW2QR16299GKizDBZa8F9iDqw4QhE1YjjjXMxX5aa4d4YaWIIoi3GOoIX0m08WC + 2oa0PD_W4WKC0BRnW991dmbi0aca4oYEt02GR4O93pW19G2GRfsg91J20jOR1W899HgjjPZ4 + a4esmsWGh9WaCLYaa0Qs2N2IIGIORlB@H01QIxZ81894QD2QRXaImsWf2I8qQD0080wqca62 + W08IIJQaI4W089fHGG010eqb9fIW0484e9980000bcqa00100J7IYWW040891IW0Wof_006a + c811000IINGD10OJGa0000aIIYa0008089RJ20W40a8jf10002YaqqGerK0000gy232j_2ts + qVW0c68RIxHI2QW4fibVD91o2pcifdW091vZFyfK199er@_14aW4whV@12MQ2o5@sJ99FIW@ + n2g9Wi@@l7O98IKzt_da4Aec0F1ab8v@buDaa89v@5vCI20auVlyC9I02uz@yE8911fjw42j + c0@@@@9OVWaaaaGhr0O101QRQJ2W0a0ijfH6aq09scaj58A0mIRqcOHK0WIbqs20380GRQQZ + W880efDfY2040assgb6000bs6j5J020GRcs650108PRRZY010afjj50G20gjzj80G2GmsCcD + 004GORRs40080ej8QB0qMz29OVGS244QT7Z3XG40508018MMZA4mWMUK85dRgCXWzaDu9PHY + MJa3QQ8K03Q5uWmfb9V0K2qXX54ueM8C_u3d_nUucX60108CBd8h3dn0049800e513kBbWVe + Q8dW2ku5X5iO8aW6wIWYa5Ce6W309004v0E2Y00MnpWReA0K00GMHFaJmOXM@nSbfW0808c0 + EIGMXg9MftASs6aWS2Ieaj3o9eXSj29rXR0040s5j1rDK0208Xc7C8xY6wupYI2k8TC2wyZW + 1KBes130C00q0d1@T03824ao3B8dW9k3uWIvi8dWB4081aJG47jHGzlLC2m19_sHD0A0I008 + KnCMKfb4AZ8SYQAj4XdBGOV05M6EXIjBg60SYtXWd6A0W00Gib6Ks01T2OJy2GSY02T24301 + 0101808048YlnWsBUW000I80D0500end5ce9b7869WJC0106SUH1H4GG61D8W008iW5QDXXC + CCeGK4AGXXGuBuTGLomeZUZHWW0ImiHCyEi1NSGHR7J4ZG473NJr0I4nV10880g9WWB28W00 + 80801Wf5E8d0BABeaVMJ8d0V0004aJG101106FWWS28eMW68800SEL7WW00Uc0ZZYsOP4Je0 + W0K901HQ4IO2GC6W2r2mGrX6C00HR8G040aWPg_9YIXA4OZP2K0420GD2CCvm1h0amX2Nap_ + 9ZX9344WG000G5aRmHJ7CjXHrOjIS2N04208rX369Y0030095pnE0XqDn85IGHB4U0201O00 + 974rWD48ed026Cm080e07pdm93KiZW1@PGnR28iZr1nmWo00M03000040nk55yJ51G001c@X + 0100G7IrGw2DSZ74jNemRB7Sb13DiPIg3L0282000G4410WoaQ0120Ge17CjT1PNrmCC448b + 1DyaGKODqW06Xw4322KG5aqWGJ81HW2IWi4e09A81Y2KKia54A9GpYcc0M22GjkkW8Wa499P + 9IWaW8PB95aQ2rGV0JIIGaa092GoIWaaW8131e6020898HII2YW8a49911aaWa9OdGAh4q7R + 2XMl10IKGa444GJ19H00IYi4e49A98I26Mia5488Hoaa4a4QT20IIIo9W0II20vj6HD04K1B + 2X3O0GIoI4aaWe9993j_WWkF8mMEoer201G001022NeX99G0W10GlLfb8Y5PLq0018W1pGuO + v3_1012G00XMBd002WxBAOB92gZ_0200WL_z0200WBE8u7v3AQYXp2sep0M2jUZSgF8dW3Ih + nX7mLeRU5A0wiN28OHA4E9GXgZk918JYJeb0cSuBW602G8Kae8RSR5oGIo2FEG2IIcbaa5A9 + 992M2Ia54a8nMIwy322jcWbFAOA024aaq40j4XWKWmaaaQ0Wen42g21Y4HS1H8192IIIe4aa + 8C89HsI2W55W4f1A0IoIAaWOBv1K0mIIma_B8dW20aaaq9G1IGIIaaa04Dm14a4a88901III + 8u452xdWQ080189PE1yKgG204W0UXAZQ0A86dDUuQeK7eWqsWaijjF3JQpisssaafCf2QRpo + cs6CXiDR@d308WcvxVpY4a0YzzjX27c0uMMo413E0SBBp61130vVBs6a010yjQR3t000KYzj + b33308sss600u0osspC00O0ORRn600C0ejDTB00W0msilD04QzC01e01a40070a0GGI09I8G + 2208o0998IbW880W5RQ3519909CeX4W04026oYGKaYG3Be68B3I0J3s699LI4X1RZ04894Wb + j54baa0Ycs6LGGImssn6IIYYORRO699LIejDOBaaG9nsceDIY4amsGhdHI22YR8GOG99emX9 + WHAW0u5W24e92240B060AtW1j0K4WWGuGMG23J2OP5RW5992ikZPWa4AX8CKRLW49XGMij8Q + qa48qrs0HAI2qOOR05191RRZRA9981jjrrMT1QHRa898ngjZDYa4aGerr0W8lHRAY20444zD + flO0G2aqsq8000GMMQ3098024JGnXI00JGOaW4W0W8DPJGGW40a6D90W00e28F900000Xcca + 00000QJGovJ4OIII0008WIIIpGhBWqa0GRr4Ga0001099AI0WGhfHR6080ZIIjbZb0W904sM + oo4044ORRFRIAGj4h@wdGMibWVxo78J6IS3Vy75118aUUwdaWWauVt@7ebW4vo@VFKGGa8l@ + zF18JImt7@FWKEr4WV89HGo@lnVa498n@_vVIa4bmx@rVGIYIIerqWWCiGffj91IY05csc8J + AR04RwxaA8KHQfDwRC03IGfoRRX0150eDDjnI2K0aacKH00A0QJJq2JG1WMRZsYX010e9JRZ + o010cefjHXW00YqssIEr58Q10020scDj10060Rscs00020rMz3XMZozM6qYq1PygH6CLbaDD + NBfmFEvaaqHL4eGuABS1G27P3q004Lm91lDamEUD4_d2H2_HECEqxS4JESpT35W0080W00Gw + b60W00OHc861uWd7MvKE2UE8XV8i140WGy04aFW103O0o9WYIlK8PW3oU0bW2duimA26M410 + 20Z1OHO38yHEEj94IkKNid71pc1nI1FaJG1v@HmegMqW1NDMmG60702000I02ma7FSoG5xOG + H4A9S@G3X7ymB4ZaJ01bAiGE1cK2m2v4ymxlD4GG3PC0HE0A4Qz9n8W0600WDOiexWCU20XQ + JR9S2FoLCXW4Ceki3EEmWa_E99B9A@3fWSLG041sD0EajT1G000Q@G21000BiSHE1C1e0008 + 0G00a0000202G00EzvYTJG0800mZ8GCEB9XlQ3012008008040080G000COKp201060C0G00 + 00W030Wg34933AoQ4foS8W00W00W0800G3L3KW04GWz4W0100GXWRS5m2340n0Rz8802epd4 + 4WW00W0008GH0210WOES8Qc96xO10208Tr3IE1t02008Z02024080X187222gkWmEAOk356P + C6WW00nxmoZ0M08G0O603G0000100Q3s7IR0XN4C0200Gmq44HC1FNqH25FybrDzVQGR1A4T + m3v4yG604a5W1X8uHE1o4d059BHGV360880e2X3I9@W9B_9X86cj_64008j5mGC64KCH4ttF + n00G5sF68H022EeWasNOHX42UWY10_u@YFsOmYS2ie9X2AjW0G000l2KGa2DS7G29mIGvn5K + bQDzGKJr06iXG1G000W000W084eqi4Yd511000tjyGoBSiNG32400AZHdKLDWG400G00W358 + OXW28020q201f1eGb384xG1G000cFXWI0Cufb4sUWXeHC8S2W4002920001H0GI14K512844 + 0_lGXb1AuEW5YMt00200V24nNB84g3I2V185IGG25ii41988o6mKae44810Pb2UI6Dj1oIIG + aea4TWg1OI0I044a8990f1r2aWaW4ag1QIII2Iz0oII2vKRGTg8G0IGgEL4W091L3023pMGg + gE4Qz52R9910GI2bCi0198Co6mMa8Y0898OqIUI0W48vir20IYIYWaYeJW5o9m0baWavjQH7 + t4K3G4aWa42VzcOc9uh16IWGX668e44B2Q8Zzr98lfBIANc40AOB_4IAfYhPN8OW78000yOR + 1VC@qi1B8208uf62I5m0W200n3Imb15SIF175imI9dy4W22000kJ2bOOm0000mXE8S9G1f8U + mF2BKm11G0206LOXuIAO09G6gSYqMa9S2560uge72P8WC4W10ieO6LM7ME1Q0zaa4188PX77 + OD9DXGIGYWaa4P089IqaaQ@W1GQ2I4abW8B9950z8r0GJY8KWjaaCqQ300IIYC5W49A09I22 + GWab089HIMIfWE18GQGIYaa4409892IM2Qhk08999GIIGg3W0MIIGH3KW0aaa22o0899Om9v + 4F42dpKmv47qNXETOKnd0Yaw05qW0EXjjjA038cqssckiD4mGRRsxG48ObjPxva5Whq7RhRI + DmCmakjCaQG60wsUc4vW10@PRt88A08RBrsCk00WiMRxOY40aMzjj8m20arpsM00G08dw280 + msgiD00G0GhssM0480WQxRR2jc6WYoG020WeB8R08W0m09fC11400gMme1JOW414WDeH4WE4 + 0m6m0aIW28I38H28HHCW5K3Wb09WX8R34C89mWajXYWa4G0qs080I281ORX829POR3R3988H + ijbDZ4a79qoci5IIXaOR3s69HGIORerp8099qbF90eqW0y4qWWLIA488mW24e16YX9QG44o2 + K0I20WCQf9AXX9H0iWD4WKKH8sWC01AX0MNgjQQYa02et6A0QIGq4RBYi891AKjTWYcaWjik + DbaiaWMstiGQIY4xRns8D9IYjDSRaW09Xj3jk60UJJcILa408DHIH12K4a49948H00Kqc46H + 2008mcK481180wHQc44W0W591R00W4W16980000e6f9900000bYa4aC614aaW0008GPII100 + 1WIMQI0WW0089DRhE140aam9102jU6tqsSG4461H9QhJGQ25jeerD99o4YoiBd08P8Bulhf1 + 8L90UduH0b04unl@1KI60Sl7s3R8fIufV@381IIs_y@3499PwZ@@HYia4M@w@HYGI2yxd@3I + IGYytdl7998Iy@djLNWzp@19P89XMJ3c226absc08OG5ORQZC001RCjDJgK015rqCDra4W9r + ejf516G0Waqa6Q2O9GQRI485i1e9DHB5W00AD9RBc600XcCjD2W00GZqs61B20OJIR3vKhWc + cscSg9Wss60020eGhl1810GkGIS_13bhDnqGCLss8D0SmNw5qHo35rqG0d6CIq9vs042G001 + 00GthW0101WgKCW00GGKb7zISFTaIGcg6KXK1rmW0900000a0h2G0W40WU2Aeqn30400108G + 86e6whZW43Ie2ec0OH151G16000IuiWG2A0e00GG0905W4eg18UVeX0AuubpU8000YWW8uz0 + 54XW000G00m02miR90GG0gO050400cJm65P_ml06CyqFrRqnC14Wa00y2028400SUX7nFSGt + Z6ynW1@FuG11nyT01ZNuGC2CaFm2F3OHg8PTSW1P4GmAf4CgX20Y00cwGXqkUG000H906axH + 1fIEIx4ta8210W806LjWS2W8J14Y00XS2KG440Gc2N4mW3v4mGYlqK3W401W0cDHZl7AezGQ + 2dOc2VDeO370e00W010eYW202I04RH27gqmyh7iA02@9SmD16KVQ3vLWGe1nKt01hVIGd074 + 9W1H3imBSTi3m2lVFIs2o0900Oe62U6eWIECe7X3G0044DX2L0OmI04K4U2PR7Jg3o090IeF + 13_FuWC7CugW2o1TXH0C0G0Wm917yJZ61Skqmi98008020a04W00f000xCV02G0WMT88KY40 + 400StG1bWOnAWJ19808vY4AIg0W002fNe090WWr1_8B02MFeWd0U8HW340G0aJ0F3qImg5D0 + 8G90G00Hm5AKBH3FJ0nT06iWa6v4SIkCOC1X1a0G6002m0801eze5cyuWr2Ceh05ketWF1Iu + C02_v@b10IH10GmO9804W0Cl0CIkqWnGGPQIaWW00_oh1vRkmL89iVX3hv2n00ZDUH2xpJGy + tDyeW33gAn004W100Oepj_bGXLjGvrX6M5PY3MW9d0BcFDX8pE8UCEA4WXH2QOoP360GgaPH + OUW3U0mWkXG8y42oIGX22IG020mP1ICsM1nmSpG3QqPT171KGP764lr41JLGdjR4EnK0K044 + 0W0W0200040GM24yIW1L0SGfF5CiJ10900Ic0XkCAeZ05sARXGhJOF2FoFM5AAO9I22ra0a4 + 8998p6tK1b4e01983IoIQaOP9PoIIYa04838G9oMIIaa4W8991HMAIcaaa0GGIIj4aa1fIWa + ba4A999G2MI2jEYHM98qQ38199rMT2fgUHerN00nb4901Da2GI4Wa40RBQLW020aW40BH992 + IiC9998GIIGaib409099d022VjWSg9OmL2Y681B999j5GG6jKbre1800Go1BXj9MeXX5INuX + oBSACCDQfHXX0OW800GnRYSMBIB7f1G0W0G2W00000Q8b0Y004nYImD060240uGa2A39Xl_H + up46kDvXi08eDZ56Wxa24iepX20900aJW10I00o9GXYxOP00ioBXWY1Ee5cAIOfWjgt9K7V0 + 800CL52000m_7GcXDrPOWDGoJIc6D1III6Ayu0GIIG5UKGer4WWaa4819Rx7Ca101XWuWbqa + agGkG2IIIY8_4K21IIGKo9e0Wb4a8H18HGGIYWiaCqQ20919bJG2aW4aofs0IIJ209993EfX + ijnAZn6U_JXklS8CdF2d0BQBJGosssCCeX8QRRpMscYfejDRRRIMqosijTRX1cocbjF9I8HO + @tsEiDCvHRVRHkz44YaiDB06c2g9m4M60WjjDx0Q20assij8C004RpsM0eZ10Rpws08Y1WPF + VR0eW10jkdD1um00swoXMN32O038181oW9a8aW48WW06XG00aGGIK019G2201o080M20G0R1 + 098f00W9000aK10WGWmsGIEomaj1I2a4QOms09HI2DGOR04991WWij0aaaCi1rjXaXb8sGkc + H2MW4Q13s2P8KIiX1RZ49A9iDqwP4a4au20qaK0IEOH23YA9022WC0AY489KYa05c0PZ8ICD + W00ib01Y04GIKI1D9G3ee93981DIW33rMDCGI0XXR342C902aj5IYcae5ssEPHJIm6orcI02 + IGBSOM811HYDCORam09nMbiDIWsgB8qwOG02GwrcsK2410GxIRq2020DDjHIOG00ia5fDI20 + We4jDbCbKGW9j81202I6asW0119PRIR9dQ2qaaW0000GQIIW00008DD9D0G0jD9bGh90JJ20 + W000fC99xLGWCC90G00GaYc42jc6pMsJW04Y8RARp2H2W0jDDBi80Q2moijca818Ig@HX408 + 2CxtcHlX480Yx3G2MA0a5t110810yzT@398IIosy@Z489Pup@@H24a4Sxx@120I2yVk@3oGG + YyxUl7929IylF_d4X19yZB@7IaWayVerp0bW54fjDDGcG2Dqsye31RW2RIpcg018JfDUJbC9 + HQ9II@me5WCefjjHI6G4aas41A0P4IIJrGGH00IJts2f80Gi9JRZmW00sefj1mI00Yqqs0W2 + 00rc6s40340ORAp6W570i9DQ30440qcCj502jUclGS8MeKQ5HXGk6gg7EY0sWc1KOEe5I4oX + @288umBQDWY2b0w2u30W0041c3J0aGpG9iIG5@3am4094fm21QcG3HxiSK65_Wml07atI1W0 + W06ZidP2O9S03w7WW0RC8JL2U52Yt1OG0G0IOvByQG1z3@mO191104eN026SY09004D3GGC1 + 94BW2NHpGE1Aa501v4i0W02WS2s9bdA2ZkWQ0GeDL400W44Mw4pOKmV4a46a3v4uJ78MK3W2 + D5m01W0au4W8d0YU__2G0I2zEK04010G000n2G0200XngF8iW6800G4dm3VvsmI5EKX54VWR + IE1JqVH1LdOGE15G04W8d02ohhWS2UeXESWW014K7DRuIm2_6iII2vIYGFfhrMW5Y000Q9G1 + 80W04000ELzWF9C0X00mSeGSN011cPH@bLa18K0100Y6mW2H8080G00W0Wt1K8DW5_mu110W + 0T4g4C0002G0077OW094WnGO8oQ2UBXWj48eLX20200U9m1DXVGc264Wy1h4eGbEo4_A7z7K + 0G04Wt1AOA04gR8YP0AurH4Ax8XA2K8jJ3o98Yg0C833Pors0a000805062e080G24000O00 + 0W000uYG3sH6X21G8dW4YF1X03Aug57QSa8m000p2Km7C7yvG2H6C1900Wo1u8d062cqep6C + 0101GR458K00eO732OmXb080WG0Gw0ISrC6TxQmY094Tp8fEK150000BG0pjW0014Wf7C8RW + 3QUmWmTA0m00000Wmw498fZ5M8mWEHW0G00GZ1E0500OY8R40G2aF01hoqG48D0108uxz4IG + mXahNeVeEkSKau4gG00Gm_270308OI030e004nG4z2OmvHSa3m2F1qGaEqqJW20202UduWF1 + O8q2CM2eW05MO8M2QF8X90I8zcDc5eYWJk0W01mT25a1U2HhrIXE75CS5J6ym737qoW2BHwJ + V0QyCI9PqIG38A04G0O004O0014dWA1faGfFB5V11xtIGjxA08040010mh19SPX28I00Q2e0 + 4C0030W1W11WaaUg6W8_0e01000200Gs0u020Y0Dgi0G08WL1o8le2W000Cao1J1KG6064gJ + C29WALI2G2b4e51198oI2OieWa2Pe812_IWa49H2MMI3g4GG2I8LL4CYaX889BH2baqmr40a + WWC8L2Wcab0999HK2IIEr88B91hEr38898Ldg1abW42j61MIGIfgQ0119eGh1H80P9GI0Gea + 4j8880GMI2Y5bb41111Im3oq08WbaaKX04WWWaiuL2WWaa889BHIQ0IE140aaa8lL24aWa89 + 9B1JI2Ye4a498f9vjU0mIGoijB8d030199HI2I8yL4O919zOG1XlcIf29qCH1jhemKJ6yY35 + XMh6G00GW0W0HdHHiXSm000O005W800S4o6tDd3W0004880lNGmF19W0WGAQWA2WHYJ2g8IW + 3MInWxECfq_D8800G000uEX5kHnY9M29dW6w5mWpcxfxX3gRbW10eAvIJ23Z30800Naz0800 + eWw_Rh32AyW0IN0IWaiaP912H2I2Af42GIYaq_X1QII2c0W0GI2I4aaWQ@81Waaa09B93WU1 + IGIIXzRmE04OPD9e6w68D994QTDmH2I5Wae899B02IIcafa4A9192IYIo9W0WaWaT2e0aaaa + E180aWaKz95K3G1oII2cCnWsgZmoIIGss908989vV22jk61000puHmrQ5agX1nSTGwW221OB + 2sssc15e1TVRRMoa245jjPRp2o2KocjzJU3HMUarj9H232x_s@W31BDgVFRItXCAabj8ZWm0 + 1ilLRpmW10wIbj1PG00Qnss211W06VVR30030PRBR6W64Qhk0X10jQVR10W00gjjjX000Ger + nGs2q420G2SQJO290Cm88jOAW0084m4iO6W04W0aa0YCe000Kq00I2G18OG0G0v4W0CW0O80 + n1DCPQWW09166iCKKiaG26sM0KGIY8ARRK1991RROR81n9YDfePa0K8XMqXjGI2a4RPms89A + I2Qrss0HIIYCqw7qC995Qz6M0QMSH28I208XE0f8054480cmY1R2WCOI2YI1X45K1m0102E0 + XSH1Ge0Z8WWCe1aWaW1Ha49anXAh4689WoYj5GYaa8fos69IJIe6NJ3ee88OBARhjQ28vPB8 + 199XjCkDacW4ncMtCIQIaGssM301Wtss2jc5W9u9IpI40mGW09ff50I0Wqaq411X5mQJIK88 + 80W2RIs2400945I0J24a0K4Xf1G002oqqsIEr4099100008qqqaGhJ0032IRr58v910220Wa + qa40980GIIJ4044089f9qw302000maaCqwKqGEGYWaaNROQfIIG0fbelCC981poWxMWa4AEM + lDXHK207@cRWYai1m3FG8YoG06ePX18800uxv@1P99H_y_t35448qxV@J22a4_@zxJOnII_L + 7@39IGIUd7@Z8989yRF@ZaaW4yhZl7IIGaq@@_7JIaaq@x@789qQ40_@@7Qj78I10KQRJ389 + XGXjDDpmWG1nqcCj0HKmKQpqCJIooscaqMCPGI2IQQV4j8X1Pf9LGMG6aaqEx0440esqilO8 + GG0Qoqs0Ker58A222GIJhM0G80KRRqM00Mke00100OJBR50520eDjDqwVgNzZ9TA9MagoqnW + zXG8Th3oMjWsWh8lL32B0C4400H3GW40008100H4S0101W2ODuQm4_wEaxeOOolUACyZb1G8 + ce5QRPYzOe8pkNMCG4X210veL0W20WI2AW200mz0ASY02rSH04W00200GnFWGD060300eTWB + kkoY6eBulWL0103m0X00014G7058I10O0020A00KGG2r0KG8o44Gy1@cUmsMUK3W6v4Knv2O + K@D1B5KG0ZA00W0vHW4Q1810244RE8noJ7z1H6zB@mx2P088089Y8o98XAga2G88GQ17W10W + 00000m20W3oO8302kCzW90CG000u504KyE1H1OGU35i0G1x4iGk29CMWFv4KGmm6aJ010900 + o9GXC0C0W08GE1H82028d06Y8OX78S804A2ghbk1AOF09_ROXhLCOO3M2g2c4umOUX6UyzW8 + 2AG0G0mVl9i7W3F5emO1GaWz1v4CH6Wy4SP1xqMmU894FZ20Y00000WjvN2t5OmsZ5q905j9 + KHE1qKgG4W000_keWp8MOcJ2woXZO3E8xKTE3e2C0G44W020G200249e_G4e000iDH1XMZm3 + 2FW000ew05IMXXGuDOCW42DuXU4S8E06omu2G020TVJmQ890GW48E0563uWpLA008Col0DqB + I2ZCCnpWzy8m24G04F4vW9oJ0W4000W000600v4umb24yfG14480IIG11110TIJnek41604e + 873G0W8Y01W8F13E59X9LF8r150500C_31ZCiWWW0WKB9AcvBk2XWBVBuYX2M2mWzj90000I + o04S_m154W0PG0WsMKer@lo9eWH7Cu9Y8o9eWO6O04000900WS2eAEXAUH81G0207SHmeBNy + aa11bJIaKuqMm7pnHmq0DCsn3TYmmo27ysiF1SMoD0Byem195qGT0I8800em45ABmWZ7x9mf + F2sg001W1N10n015iTK5xXAs0p5000GPG23EKm0W808r0G021806020ZHiGnE8KCM1JF81W0 + 0WVCged74MGnbw188m92EvuWudJ8g92I3WW0p9OB05ojdX3TS8SYhwi1X39CunW4c78XMTGO + Dl2gEGZ_4EOq39obA7WWX4A919XY6M20i04PH8ZQKGmce9GKIIY09994MII4Km48P19HIGI2 + a1W489980ImIaab44I2G204a4895f2oGIaiaalfImUq4G6IIejw3a6a44Qz2JfI0489fQ0AG + 2IIGggJ4Qz50029H2A2259i41188YoGMbeW409881GMIYa491I4IWY44498T1GIIGaaab099 + 1HGIIYd0a41KIIaCaaI1WWQ088d02899XrDG1jkQHE18K3G4Waaa2j_ZOX901000480W0BY8 + aG3MlWYGhB3mG0Ga0QSEn1PsWGC64CEH17VIGvBBaoO9zpWmJHhyFW18W0WAQa0II20W0000 + 890Sb030208oOPXW3E0210mi0OSUc2tFYGK7uy0I3TdM010aa67Y8z12o20Xo0MO1j9Af1cs + 28fQp6k4mckJwvS0DG800qAH1O004MXOXj1W8Bc2A8OYmV8AH0AGMIJMu11MoM2Waaaf9fDX + GIIIX764QD2I2I3aWac8P9Bfz320BX95Qz1nYKW2IIoghB8DQ8g2nWqeDe604Mod0I2oI4aW + a2EP198999YiH704099HnIq20WaaC9999KGII4aa08A999d02GQIIqbY109H9L2IIYW0a588 + 9P11BaJG1H3KW0aaaS2YeOb50I2aK3W1MII22jUbI5Uui17wP2fK7iXqsG7ijj53B2Jasssi + 79C1OQRp_sWc4ziDRRb0qBXkPfRpXqF7Y@baZRIEGmsVs4OB1WS9@xY1KG2PRjs62KX1ijQR + 31aX4qgdj50G81esss6GI42o@MsCOP82OvPN68561eaTRB0745mNjrD0000wcljD1G00Osss + 62G000RPR7QT881f5W0Ga9Zc64G0204IAGM09000X8P34020Oe41034G2CG114X0a91040MW + 2G6280092O28W0RPa68PHGiDHHZa48Cm6W95IWbW8MmI6H2IGm4K6622UWO0OA6HG5Me4TGB + iX08n664DIaWXmsDeBGeDjD3aW49mMsibIM2jc0DIIIXMlXWa41d0Y0aIGI4BGBZI090G8DC + Ana09fo4WeGCC5KngGi12Ys00G040R2020H9G485WG19b43OJAoY90I2i5OO1a0r9m2ia9YY + a4fUsw8IR8268swK0JI3g1Bo2f81IybHPZa489cYqZH0W44q6jj5YWa4OMss2IIIISxRR7QD + 98140yIMIJX602e99jAH080aac8C0i0IMRYaK91G04Yqo40091W6GR34a04W9XCL0GG04tM0 + i000GecKofc00aaqHjG0cKc410002QIJr0000W2Goa04000eLJO22450qCf9100I02KqYGhZ + 488918iw3800CHJI28qQGCPIR3IIIGiWf9F891YKscynaW83O3oAQ0Yq44f6bcI48ae_9O6m + M0mW1_b18P21uNCV710j2m@_DFY4f99VZtEIY4aeV@VE8YGImzxjE0980nxvSFOB19of@yU4 + 8a1nTSeU2G2amlliVOH2Ko@_@VAnIIYxx@V49991@x@VW4aaW@@@3js3840jejfD124GWXsa + aPI8ZKOJJcKa808AjPQYX1HJAHIIA290C1DT9F0msmWqayAAHRIGJIY4AG30KQJsM0013WjP + JQ6W50Wc9jD8022GsacMWaG0esqqa0O1A0JIRq0400W9jORWmG8WsaDj4010WsGhP0QJRRer + eyxSAp1nnHZVCjNCnYe0GG0WpjCGG20GUGJCF06ZeWGG07y_d2r0W0810W4zsvL03_gW0220 + 0FWom8d6yNW1nL22G00WZ08OW13A8uWSALO00RC401y3O5x9G040aa04A8cW20810K3G1I80 + 0Mi5Yr6O0GG0200WY05G0X80m4VFiQ86LGe1H40W11EO2B32BmX@_Gu6W2o5GYG4V0G00010 + 0WuhD8I030X00avm23OoY208WnyA06001010W9GDudk2Y98X9QBeb042LYWd5WuF16W0G04V + z197eGp4DaJG5rzOn2f80a00umg60108zK01BOP022IWZ0AOsY28000LXC19FG080003810V + AqGqe4S@R2G00G0W20KuA3rOLZ000ah2A0500mS3GalL7Nk3racH01000A10m00483108403 + UyT11G0077qX400es2K0180GW3GqrbEY00825W0W4O0H3KGE1B8200eDb9gwDXS2gG04Wm51 + BaJ03XMB3W09WO4C81I5EMrWq0A81X50X014EW25vznJu4aP6H0200R50XX088po30880qBn + 1@4K022GYL5G0108OE06qMx1HK0Hkk7CCW24100A@BdKFYO403Er0280W0vAG0GI0WmQmOg1 + Dgs971080B2O04001G000J1K020005000f1OmHq508P0OrZ9QkyXpwteKRN6Ee1Wa000a0GA + 28XVX9G102mzhKabG1W8002Hu01004F0G0e00m22gO4M6oTlcBHGG20GmrX5i80141X00820 + C8X1v4WG07Ay0X38000wee0G00WLQOm6g64zp2X@SJ@D60410epr302034r110110w581802 + 0z2yGyH684000800mXj5Kx03T1qW000WwjrfeQ2ohyWsQG0440OE6HqDW1r9GmI04aJ01H8X + GA2Ka2G30100_zHaK7wuF020Y000OG3uTW2Mee0000eBH01W00Wf1ie5W4IGoZE_afC04800 + 0TBW3J34HE1PC005NDjIQ1bqfn49Oa0W02Wdmwuo16Y4mWi9U853QEFYWPXMuZt5soXW10kP + HKCYJGbJBAe6W6oEOX1XG9y44o1bga4GuO07k0zWX2oOa0C63WWMdGOd28om8cQXCuK02_JX + WhqKG00GIG07yal1ZwKmRRd4Bm1nwYmQs7qPJD0100pAWXgwC8c52MP1X8n80410qH15ap21 + T4OnY09C1W4npRJaE4iEG1310He15aaa10G00G0a04H029PTmI06KRY3N1XmI7Iig119nOHe + rO8193JIIYY0Wa0988PI00Gea4i9089HMY3Y4099IMI2a4aCAQj0R9910III4aaC0999n2aa + KD058999eOL22Vb040aa5lM0IGYGbbaa0990HGIoWa4W4B8P9I2I0aaaa8O1I2js09191XMh + 2IGGokLLG20G25aWaS28WaqaOpi48990HMI0W4aa4R9910GII4Wai8199G8aaGhhDKK012II + 2Y6m06III44aa0819HIIIWqeW499882IIILmkHuhe8080O827Ig0YxKG0G04Gi5X4Kd1XMtp + IFPKJa1PNiGVq4iE41NcGIor7KHn1b1WHOn5i_H88I00k5mXUXAOtF5_v3YL1C8o46s8WWc0 + AO102AE0180G0LYiGyyt4AV2bu1Hp07aE83v4KG0L5awJ6v4eGFA7iUpDRLLGt3O43G435YG + hBi4S2Fr0GGS2DarW1NmOG51X0840OG1CManWQgKOe7529IYGhhmcIIYaa4f2FCGooIIX74O + IImADQ20aia8f9XJIIGmo75e0a4a9189oMIIaa09QIJIaaam89P981428B9852I28h93h2f0 + GJGIRXK0qaa418PfHJV0GIIom_F0I2IIA_5aYB1XMpXjba499fQIIG2o9m02f912II2ajaa8 + HIIYCaa001A9IGGIaMaaoss0GIsIaaW4ECX08898v4OWaab0891Pv4WW4i449898GII2g1W0 + IG2IH3GWGII2a409v4OGm9m8220eK16YPeWy5E86W3oAnXL088gU2cZuYFWQe2H4cTWWU8wO + 70AW9Dn1RRRnWaK2ljjDB9PHccssiljC9JARps_TBIyB9@MoaA1OcDV@9WuZ44@azFvwhN4w + oI_H03XL_tgrP952EPlsV099C7bORFH01e5hbjq1XYrWalbD3GIG0sssz1HWH3UPtsYG0n3i + DR930XMF310I1098Hm18a1a04WZoK4100W4GQI2W9920200K0OIIa000P8428O3WW140C50C + WW20WmY40mcc182G01G266m0H24a0A2HL80AWba00aXA5af1XXbGX8s0GWH22Z4I9LW2O90G + ej113agSBiDqwPa0aqum6q0K2GYOJJ04A99224018ca0fG04WXM289C4a9006C06XmI40S41 + 290Af8WfXstAWC4K0WmGC2N10I820WB9019D50mji00aa4XiXa8h4W8CqIp35IZ4Y0lE268Q + GHaQhFZ88984QDD4009SxRIJ1W008jfFQ100Wccq88880HMIY_29HG0MBmqM41911OH0Ra40 + 00WDXK0GGWWYcMW0004i2a8588020JW4mW0W0WDRQOG0020Cjfb0000GD8TD0GI20aaM418P + G0GJZaW009099QR0WGhdHjjb8W0e1msosi4W08GRRp13IWiWiCJi992WYmyP20qG0GJps5KG + v30PqiNi1a90MPneW22e1_x3EWMY65OEhN0PItWufBh00eOaqsdy44W01@de_0i448xiexHI + 245@semP11I2vsWyXa808@7QzC8R10HJUJIWCb03DjDpG02emqsih00KYqRpk6Ho2oKYacKC + OPQGIJIIiX9j09f9Hm40cbqq4vq4WWbssC90G0a6QZscC41JX9IJJ4WaibifD9W8WW0fjf91 + G0K1sqseH01m0RInq00W01jDRI9020GjXMJp2ONCqZ6RwemAHZa0J1xwB4WC0WOSo8qe6__J + YsgT89FCURqb_gN00G0Ker44cT3F3eGVQDaJm1T8eG5qdSAvBjCGGyR8y001LEK0100m71S0 + m00GArCav04tcMGe0Ai413NRl3G0G002ZIp3K0a000G000IA2WA6uWXXO0G000o20Wy3M090 + 8GC070Y00ecc36geXD0IulQM6lu1801W0192Qpv0W00GI220IkO1G000TDWGx84a1c2v4G08 + 00WM2C8d07U0mWm4ouF3BYlAZubT8Sh6swuXg7GOCW8wH8YY4V9bBDcmcXGhBOHa9w3eW6AK + W000mh4BarOGrPaHYH504008ay2weuXL2AW002GT8ByWK1vmImM0E8800O0Z5w0mWp0Cu906 + o3R5W0809KNGE1L80G08dW3U5W18G0G0001o9eW10QeZ03IZ_WE0AOON7oLmWS2e8ekD0484 + iaW1R3OGY050440er1B60u13000XXOHp3Ei0N8X8MHZ04W100uP04W0W0CUY1RFGGm05yAW1 + N5Gm6o702002118m57O4d02rGtID0VCId3r0SGL79yQm2G000oNvWd5KOPX2YomWQ0Muv02W + 0G0qAk2fhYHE1NGW0Wumo30400i9G1HBq020CWD3i8x6660ucw9Q8SYB4404iJk10X0CM2eW + eoA0402020XWeeh0100uf8B0100OkP2IGOYy0I0480GMZq4dZ1ZES0m00Wf18G228mHp5qt1 + 122W00040Kl83hTeGr25W00W0W00Is5CSkH6blE34W000208bbSGeg4CFn1H7O0K40WN2G8i + W2c9m0100WY880d0eWSKAeuW2gpnY4wvOx4H0104asn119G0W0AWbBGu312mWG0awm3a000I + 5eWS28uBc8g392W010X2SGQDp0G04uBX2UDnWw188ab2AdjW5HIu_058211yoH2j0Wmi0704 + 00Of022Um0m000p8S0010Wz5AutcP08G40221uS54cboX81IOK058011CPW1P98H9074H43h + DSGM0Ce0008eW9YJmYBDB8D22sUiX4080200m26DCLW23YmmZe404000Y0Wm118q303Z9SG6 + Gr4s31X8wmmF6CjH5400WlAGX8BU0408mkpC4K01PPGmmKeqtX6800HMFeWy5IOc35omHXxe + G8Q0Co90XAiR9JQJ4800iWA2Wm08MaWXplMPP63YSFdPcduWa242004LH175K080108000zs + HGa5C04002W80GN68a561R0KGU188200uHaA0808aEH4LQqG75RW008yi14kOeWOiLeAN2wv + o0Wa00F8GmL37KBW10910A8OXSxQeRW5EcfWK7k1G100080Wq3KuL232yjWM1QOOx3IUQX4W + eOGN3_1uWD8S8KdOGq00g44a4A5H82GQIab0WGH19HI0Mgbi449BIYWie699PeMI22aaaa00 + 990IGIcWda4B98A2W408H99nIGIhww2aaei08981W2GcaWW08GIIvKJ0moGG4aWa0999ZZb0 + 198RHiQGD040WaaCqwLGa2IYKm44A0P92GIGab00OH90HGG4gbi4409IYaia48988MII04aa + a81890IIIYWba4B1980Wa48199HIGGW40aKuh4W5aa011A1oI2I4W09LNJ081B3II024caa8 + 198H2I2Yaij4990WMND8d02Waaa4_gA2000oYWXVPY87A6w4hXzIEe356gkcammKvUw32b1X + xmCOYB4k1uWLDEW200mn6CSjX2p2umP14W001O5W4ECmWgpCev8460051A00882000210081 + eS020812iAf10100ovOXu3QG0W00004X7eQed67M3WWz2COzd2UDuWj9r835C080045W1v4G + W000me0C0G20Ig1U4O31n2W00X1WfRaeQa3I7NaUH4PLnKw59XJTSG00GG1CwKgj6C00WcOm + WC3MW020GDEbasP1vsTGaLUiV07XMNXvba0999gKIG04aaaf3P9XI2IIX740I2IinU42EX0q + 4aa819DHI0IYWba498GYaac499DOIIQ222W0mGEIaaWW89v9HII2eP42aa4W89918u4288D8 + 5S21J2GW081XRG8081992IGo4HG1PRB1IGIIeiaar0GWiab42919r0GW099G4a0WH3KGss7W + 4aa41199IMIoE1A01999mIGI0aaq899PH4II2aW44H099IIW49B89bQJ0C98f22M8Rx32xl6 + 10W1tlLmB35SuW1W200_9RZYpXufqXITW2QIPPmsssCabiHRRRpN6KaffjDRRRQICosijSof + WWoZkjDfQ8HOoss6KPCXGzPRJc6q6XljDRYa08bzzQR8pa2msZjDWN43GBMsMGTWaWQTRR00 + D18RxxpW0b5Wlb5RG0KyWsMiiG00H0Pt_s8HRr5O4000GsscD00Wsg9WC000WRRxGht09Xe0 + 4m04O6oa020GaGQO0089GAA089e001G0WG114H8f00Xb005a0W2m4ImmIQ42O0a009033GHa + 8180Z51IBa02W06eCbGAS401mMo8o020scboGI014JB0m88Z22fj0G1aCG8osqWXIqa4Wgjj + 1Waa49sssusgD0caa4fssMDOIIXMlXa0Y7Na02aGG2G3191I8DHIW9COHa48DI6aCLW4h1L0 + eD1IqfaeK6m4EuIq082Q0XO900af42B82G2b1Q2eW890I8b92X7aG0aW4302289G80sMGmKI + 2232xDq2899JajL1Zaa88ocSrHIWm6QcjjLYaa4Qtss2IIII_8m01sssCGII2jU3G6MaEBDf + XO010qad4e0f00IIIs620aegjHRh4880AKHIBY4000D9jDII02W2caA4001GGJZC0489KA3s + 400080DOIU02a0mafB900G0IsYq40000eaa4UMC2Wqsa01010IIRZ00W40D1DIW000GD9HI0 + 2000s49910000IjLNGerUu46K2a4a0POIRNG2IkebePg9910Ws6Pu0010GL_k9CG91eGysD2 + a400jTBBY6I20Bz5QO11HYVvGQ823GocFj84C89mBKoKGWWamP@OB0WQGYxtoVGIIEa@N0vO + 90GYuVnzaaW0X@VQ_0o4aaqz@@0Zaaac@@@0GII2z@@@89991r@@xnaaCqwD0Wc0gysc6OO1 + Y4JJIc90W8XfDPILIe4ii699s2XWj4v9j84WI2aasq0Q0O1JIRg0fWC2Ff9Q1ieP0DfPQXY2 + 0CcCDf9I042RqysWP3A3HIxw100KXQRPJ21GC0iDFH30GW1ssaf112G0MRMaY0jLN0H0000q + ss@NG0ssssSP88qwFU2nWESMOrC2E6Ba@NKPurLIZ_YmVIe@HBo8uWe1G8SWCWW00C0G2I0G + 0YoDe44IeC8C04G04096@34nihXq07CzBUGm64KkK1BjGnsS2D0GChUN040030G0AGGW0Ydv + 0400G3Fum9UDCYO1TqQ0WWIWk7BeBW32lCYkG8e502EjhWa5Qe903MmA402W2b1J0GGGWZ1A + eDW2w60XYQN8dW50100aJW1LBSGN05i_529co0I00aspL8dW92Hqas1IO5ZCs5GXbEiOxS3M + @1dp8GvL02YDmXpfOuMI8YJOXigXffSHU50110104002wFWWGvN8yw3_4BXAE0v0r2w5eXEn + deGTL0G01iHG1v4On92BaJm2B9a1820WS2m8eEPwoeWQ0A0920GC2XW0008uX2_h5X2OquuX + F_30Y0rnOwW3wUsWK1Cean3YA8ZrX9u717gh5XK2Y8HW4A@BcOOEu9l3o7rXq0Se5X3U0mWE + 1ieGV2w4uWS2Uu@02w8ScyIG0X000W8G004004102IRJZkKIG000IUCCb6T5DjNGD040600O + 3n2MVXW01LOWW5G0W0KTG4154nh9GSYm2PO83G000200WPbM0G0mW11D0060oH0DygY1RzIm + rD94zx2p2mGS09aG4GH3WGE864mO133Sm38FKUW2CW0Gw_3YH0E8eW38100W00Gu915W002C + JGEP8O0208Wg1IG00000H0WjDXu5Y9kOi18G00rvemj1ESeG9fEKn7k44Xl140040008H0I0 + 00IGGA38y@Z1B5emgM4aQW1d3KmPu8WW00ON15cImWETDus1Vo9eW0HE8d04kYIZ8AKuLN5Q + FWWRTP8dWQEZg280G05uQGH24S9W10200gugXV2W80c7U5e0020W7HW0800WV2C8S05wmXWu + yjX04GmvDEqsq25Xan65EqOm3X2Wml05agO613mmDAMi801vkVm827yE02v1GG@F6aorFLXR + G66oC1k1rJOmM38G0001G20mTjNK5J630iLA4G4xK2vJSGa99C101FtBn80AypS1ZjO08001 + 000Gd7SGnq9qxxAZ3KmA480G00Ofi2QfZYw5I0414mg2A01000201GW0542S2H6KGy75SjW3 + lTeHIIOKrH1R4imZ184e81h1umz14SwB3XSeW0GGWP2C8@ubGG2GgaWa4A1G10I6G4XcaOH9 + 91JGA2aia499IYa4aaWK9Wa0a41919I20IaaaW81R9qWA1GG3IaaiW8D18u8028888Ldg22Y + oIaaiWO999mGII2WaWC89902I2GaaWa812IgjQ2ILzWk0C8qwG0G0IY4aa0A1S92I2Gab04O + H081GG2cJ02A9981QIIoWaaSf02Ybj0ibaajLJ09A99G2IInoI0MGIIWWaa0789Y6m09G99I + 2GGi4a48809HIII6aqWaQ0G8yr9QgjWmNxOj22_FwWFYAeXXG4000N3G1zNWGJ0Cijk10W00 + EWRYmme1240GwA90G0085a4UTtW2nk0801mMj9C101W200c8HYYH49xsE0aW0qPH18000420 + IafZ1D0GGg09CW02bKlW00Web080e00Gu1NyJ01Z6eGO2LaM04H2GHE16a3m1v4imo08CPI2 + JbGmXEG0018OaW6Q1310A00D5ime7AC0GD1gNGm26qim1XhTm8HZqr0DN58H8YTy5G1G1G02 + c2XB2UO@26Ab0X73GeNW6AlGZ@9M8d0Jc6n0eaba5UK019HfGhB0MIIY5999KIIIa4aq890f + HIIIoaaW4999ikF80P9SI88B0aaa5P89P885GGII8A02Im_0GIIIaj4aIZcXk08G6IImU040 + IIGe6W2wIfW4Ho0999fGIIYS28G2IIMD04G0I2g602O22a89A9HGo0WWaaWE1CeTN26td0aa + G9@fGmfA44sV14bCiA8m0MII0FhGWWa149191r0KWIGI2a5aa8899GI0a4QW198KGd074QD9 + 8000G0W4C@L2F0O0914WHS80WW0mg6B0808v304wVmWbIe0202GS7IapU8fEG1L090OPRx6W + 04ejjjPBH12wqtcji91BAPRssEHPIYvns@YaL8FiRvF3kMiXekjaDNIkmGsNoDu0BWmwMjD0 + 1OwPRrs2YXW8e7RRBW460GjjjF0E90ajaiP0003msskD0042Gx@sM0s83WjPBRG400aFRRRG + 800miijDW000Woss_jN2qtss4Qj6Wa1bW8Wa8pq26G20W0AQJM00W0K9fHJbW009W00IXi08 + S0X4000e0H406G04Ia20229038Q28OJsaG910ae9I00W9GmWa452144OW2Mc1000m6II6Is6 + ZOBPL6909Gejy1Baae8nc4XDI0GXm7jjDIWaaOKss61MIIGPRRBO999YjjjQaaa2jU31853E + 89f854a9caa4b00Y401ICW89II491GemGA0hGP120e341We4C44r600Ya0G0m42QH02Ir00K + 1Am4i8HG2DHG08c1402b5P2cY0Ga4aGirikf4aa6qIsW5oQ2aOJIw6f4GIi589Z4099C5RRh + 0999Kijj52jE1ncssCIGI2jU300a0_j9fe000Wqaq6f0010IHIa6W0TIJWK9900MOQ0K0q89 + W8P0R2WW4W29j50Q00IcWMM0IG2eMaa4e0050JIJqW608bXfPI0222aaaD50W0ae4jj90004 + 0asqa00180I0IJRr5KTz1a400000f5QT1GJIIg1W02II2XMhXRRfV00JYYjjj1191GY_Mcj6 + b4943RqtJIaa0DX@LmmWjWJWbGWIm60ubHU8A904EusB0q5G0KpYC1eK99KQMq0I4a0LOQ90 + 32G26_Cz091eA_bNq1900H_@@qZ4W09_lVmJoM44_9Ly39H2I_hjw28t@@xH2IY4t@l@98fs + g9m3P9PerRWj0X5Djj9G4K2CsssCJJ206pRpcA000OjDRRi99I2BIIRmeWD5h9991M606ccc + KHHJP6IIJa2HGYaIQoq280H8EDRRo4WD9c89j12WY6osss00G22rcac40980ORQn60DW0i95 + R304Y0qsif50000Lgjj54200ecss68000OQRR50100ejjDqwE2lvX2GKOUG3AiQZPbGO00is + efWGhdeSW3I1OXI088YWAcHnWXI8eq7AoHvW3ve9j74o3WW0VoeEbGs7uYB9HO00U_GuWGAJ + emi401800000m0W400000O0K294KGTk5CFm1W0G0E3eWd0Au@I469eX80A0890GnFAyb4B01 + 00YZo080008000IOmWTw8eYM3s5WWGcKeW25g0eWF7GOt036W8XDmFwzn2W0100800020001 + 0000100W00GMiYYy9K8m02Y4cWg48uHd2080G4Su3T@1pYWN8W00uBr3G080cXG104000802 + yan1I004_caWv1Gu9F364bWz2M08W0GG050GGGOnY5U1yWgV69BZGw7mWODSO8aCwhsbPtnv + 8Q42HyWctFOb03G2200001u112Ea8XUjBW00Gmzl7G600ODB2080080W08iBCa010K3k5rFy + 1W08mcrA8qI4o9W11G22v4SX280WssJOqh3o9uWuVTefH641004KtB20W0wDXY_jDOxD2UYg + YM9HOyL4wvGXefh81x32dGdr18Owo5k4mWvhCeN230809C9W22002Mjs012002800sX3Xr28 + 0804qt0HKcP2xLqp615SnL2DmcmSA8qZH2ZMYGeE35tJ648G0wz5Zq0AePs5EAu0G000200W + QHuXqO9e5K3Mh7Z2G@ed0B0K04S801800GF9eWcoL8dW3_az018W00800E@nWr6AOK03W1G0 + i432RQGW010Wo1k8hHPM1WW44C0800u406yB8178Omv9A4xB1B2NGYD5yRZ100O0U5WWJPCO + Hd5QJA93000W000EE1X_bPepb4Q89Zs0A0a20m3F4a701j5kmA7T4HnA0202wuOXQqHOo130 + 900Ds_1f5nGNo5yYo1LTRmO3GK9Y279PIY8QKB01G004k0W0C000b2SHg5H0100w7X64200K + wW2RG9nf04yAm3b0H2A00WW349YW3AcyWYIB8d07obCaS2s8E1Ac_sWb0EeMU6EZWXN08OU0 + 4_GYWnhDOM056z2YwluO0WLQuDXX8K0811m32OqAX2W400MjKY_js9DwBg1GXmgy0420mL9O + iTDFfgknOE60200Oze36UkX94CeYXA0300KL12b5imQ3NaUX5b6Koyy50500W000GPG7a6z2 + tEemYk508508N258006CAJ1dEim6i7qG22G002YXfaJ3iO6022EnWz4C88i2E5810910F4WG + 287080W8gf4IkuWtv98eW42FnW2v89E162r134W01bcLG03ASpm1hOSmwGBi301tbHmV36qE + W20104gLuWiVa8qQTW4abKQA1WWWa85Rh3mIK24a44198BIIMY8188HIGI2aWa1199BIIIIc + WbWA98HMFb0OG2caiaK08C1HY1IYafW4P809Q2IG45yb8991aJj1rGtW0WajMN90899PD0G4 + QT88819xMb098912IIoiC4bG885HGIIGer6q9W1aXWa819fHI2GYWa44P9B9IG2281J9HI2G + 2a4aK1988GIGMaWa4898H1sIIWGG8fjw68198HIJ2YaibK2s44Qz4Pq2It3HSg1399XGaNLq + yG1020Ww79XEiDey2LwWlXqE2fO02oY8X92Ju4050200sCm3BS4nHADCEG3@s0JpM6GG08OB + 02_5u08008r2SGA04KYe1XdOmI75iLZ12044EvoXsz8OQx5AfFXN2Ous5EYJeYicCOo05YIO + X80G8LW5ASeWt7E0402mxGEy1O130qKyT4qMW4vzannBHKV8Cn9i2W000a0010I10MmwW8C@ + el06wzVXim88dWe0IWJ2aaa4A9092GIIab1C8G99pfc0P899DsZWWaWWsFM8302a098HJIIY + 4Wa4B989IQIQab4aoA111GIINuJ0G2Io4HCeo@3gks02IGIr0a0990fqe71f93fIII2eaaa0 + 899HMMoY41449199QoGIac88baS0188f51A02IIY00a499P8T2K0aa449P01xeG0P81fs2AG + GIIGB@94H015h4HR1BK3W41dSX011W9gDumXEgICXbNXekCZITW2Q115ossMC8911wRRpU6q + YffjDxRLHW4JsijL2macoczlDARs38tUo7ie@fGRBPJiabGmiqFPC00gbkjARIAKYmsgjTmL + R2ofs_MKDjbYQRRB48BO8RFRn0ee8WjkCP0u2Gaswil4O1G0xntt0GRr80ORRp602GRr4G06 + 00WjjTerRWqoI2200cCGIJ6911Q84XVAX0eef9eOWW03a102WG00Ga005408bGO00K00a020 + 22PK1Bv1899IKCf320CatKW04815WX040aW4g8JI08s0aXH2465P1Yo0HmmAj0AVW0291c1i + fGWX44ibjjX4aa8ssskjQ58sqs6Qj72I2_S1A3I298mCe992bX400c8G0BIaq82Ya4ZW0aKh + GIK4I9Y3002Ge1D9245W1WG2i0q6G9Kab4fma81GG000wXI6K9IG2000oW011X08qG8B8BJ8 + 599W1yCBcma8nQmD5J1YWPXb6E88HGOBssM9jLNW5IJoGhB0aa4hosseGhx0e11XJoJRA040 + 0599H8020Wqc65X19HYQIaqA1AIWIb2aY08194IO3YmaG089jF2GGI4ma2e120W2LscD1000 + 0OQqcYW040aPIG30W444f9T50400A9Cf11G20mKqa90080GIHc404009X12A0000AnJI2040 + 0099990000AAYWgh98qQES0Bh3J220yliDFg99oaMsSn068A0BXAVGYaG0BCn524j4qQ4g5K + o0M0XWP59908upQJCX4j01rs4D8008nIpqEGW04n5RU32Go2WideC8198WFUTE8P81YtHzEW + eW0nR_vFIY2aW@e@E83MMm@_@V81IIox_@V4999X@_@VaaaaWV@@zGII6Qz6G0H1LUJQ2i01 + 1YDjDxG62Dnq_ijG000MQps6P3s2MYca680IHGQRIR0eW4XfB9LKca2Xaa6fWII8easDj8Bo + c6Joaqe403X9RRR4e8Caij9D0W5WGj9j9Hq2G0qaqe10300QIpo08Gm0j9QR10100jjLRWcs + scsgD8E122j6ariaezd3g1vXGbEeOd5gRqWjz0P0WZw48ZlJCeui5w2OXRIc8IW5QcKX10KG + GG0mHoe4fY178eHdFIaBW13hLGIR5C2W1P3eGo1EKB06400Wc9m31104z3S0800WA3Ue4X8Q + XWWEW_8D07U9WXJYbHG02GpQ5ae020Y00QY_Wn28eQD4YhW001004W00QdeWkdI0G24000WW + maH8c03IeOZP3K8DW3QAC440W1v4iGt5Dq0N2xAWGE16KDH2WI040104Sq91X0OmQM44EW3T + 9Km95IaJ04XXfnZmHa50239O0W10Wv9Quds3MxK12200P3eGLi9SFz814YI5wASe16tLymry + 5qa03n9Gm00Crwj1vDOmst9000WeP06I9eWGaQ0W0WL616020008W00910mF5D0020G4X74P + W1jZSm8a6aIVCD2JW088eS2Y8CX8o9e112WIv4y0G00WS2AG0W4GE1I0KG08g38o9WXWwwe6 + 066D84W000W080EWWXM4EOH4AoXvZG5I8WpAwKEXU0EW200oD14G200fa4CokmWR2AuoF2Ab + sWfpFeqE2QhMcQ0ouTU2YquXr4GejW3setWE1cW00GGM@7800989W3Y6uX33A8k03wBdYEfH + P1z20022ik057FamNq9yZm2010WMz3X2WFOwS7USuY4HEPH042wbWC0G0100a800Wx4A8iW2 + _9W001008400W080Km2105020C0CivN1f1G0280XI88uo05M8WXu3C8qQOAfYWR0Ge_x3YmG + X45Gu702EvWWuGD88W2G00021002GW08040eW080400WG00028005INGD190300uhVT80080 + G00O2L2kvu1c0005pi0100X67MOQL3Y4YWR998d02081800m08H07QIkWm@_fULAW00aSUT3 + VlQmK86G00a8dW4G0002G0G9d032E0YD3KuB6H2dm201004C006Yv020Wu2G40wEGX1FK80X + 74W00i601WD4060W0W10001000O004wG1zyl0800WeAEO00S8810aRG24400g8WWB2EOfdCo + 9u0G220lNS0G00WMuD0G80GE1D4xdE4W0GE8WWoYSus23G020rpG4VDHGv6DW000W400GaH7 + 4Br497Omez5qlfCh2mm585K1W1H6VGD9W4hW4F7KGL07y0G1Y000Q4eY93S8OOCg18YAIWen + x8wXEX5V8WG00GW0908028N2AkTGaS2iOUW2_Jm02G00D2Sm6KY040092W38000ys21TAqGE + OoKQW5BqG0G80WdKIeHR2onv02G0GVAenaRAy7c2C0W0c5fWZ8UuFW7gF0YoOw8CC5M@9YFt + Y8By2W800SI01e800IdcW12COxC2ozPX6gJuwe3YoTcQ0eORW3E5uW4hD8oY6_V7XEWUW000 + oa764rY2XwKn@4G4gp58119Km2I2raiiqK24aWqG919HGI1YiWW49oo24i4W998D5aQ1GIGM + 0Waa8I83f1L2GGQ4gaaW0893W0I2040a020991GGIm4aa481GY0ei49898IIm2cIb02M2I44 + a08931HoIIeww6WWWb0999HKGIIerUyuA1I22KaWb48819JGGIIss4GIGp2aaa8MMII44a4T + 2GWqaa4999BGII24Dab0181H2aW4291902Io4CWa0008HY2GYa04qH04W648HIKIY444aS28 + WWW449B0922IG4W1WgWTXmNFG9899GY2oGh1vPi2GW00amG1P0G0W04WaA_0G0CGD0CKPa1h + PWGlLp46s604a0MduWGtHOIY3_hk040W0p5SmP0BW100ewl3c1WWQ0Ge8W4G011a101revGl + pCyti9FNPmsN900001200IzYC0142OU05IkOXP2FOEQ3600X@EAeS93A6G18048b1XHiVUaJ + 01Xl1HGlEan03J4SGkACqhD432GmB_ECa43TErI5U6qM03B7SGjBwil01z14Jm9P8021OqW3 + kAW0WW00V1aG12704G08702YehX5iUu5X5YUWXf4_uiX42jkY6dB0Y9HPX748PP9fm320B8P + G2IICtZ2808354017dK0189WfxB02Xa4P99fUHAe1W2q2IIYaW44BB99IIW419B9IIIGqaiD + KN210i4a8991H2IG81x2wCXW4HEG2IGIrrCa826vIN09G99MI0Iv4S022Isij90YWWK995O1 + 19GIII2WaaaE18W0aa49991ba0i899DRhk0QGIIae1aw4W0CiaaDcG0H99Xa@98d02aaab01 + 9ffjw3UDnWm_X8qwGspZWGI_0490Gu4jaAn8D1yG11K0RJNIssMd19i9PxRR_J4Ku9jjvPJE + osVMcjbISdaHMajtPGYQ2n@xs19jLBwVRDYylbSkacP10WY1kjLxJ0ZIMsMjjH023NOrsMI0 + XX1KRRR309T0PRxP60XrWitdR7OQqWqsckbORoYODwo2G100Pnss60200CBRR30000eljj9G + 000m_sEqwD8I20001PHEW1Wba448KGKHCI0ama4GY02C12004mM0e03Ga0A96001GA0200o0 + 6Lc0R1YjOOOa8900g9i9W4000smq0KIGm4ROOG818G2B04o014SYjCWwW8G0Xc0KCG0mn030 + 4K8c656MmssG6IIUYc0YII2QRRR1199HCijLZ0aKerR8915r5018fYa4o44ma4G0m4GRGW45 + GIW9890iFI0G90R1W1m80840AW0aK26Q001A8GMO0GL0sMYWGQ2G0R1IGC128mj09CaeX5Xg + 4aCWaWp0iaYFjq7a060BCO0GW0Ba3N8e8GY508PWW09XDSRRbe99XcijjWaaa46sssGGII4h + ORp8599qwD0122uciM6210WK2JRs20M88jD9J0200eq4BjI2W4iMj9a00GI05IYK881C12GI + fW4448ejCI1W0WG89PA000M4c4D990I82Jaiq00800HQQQX011XIJRxNH8G8ON2WWW089jDv + sG0b5T50000AD99RaW0f999f3JGer6GGII8qQDSQPz3HJXWikj9BP800qqW6n0WG8OPpKQ2Y + a0WfEw300a9i_l16miKYWJ8n0PB928Xw2170X8uVsCFba0nnVpW0GYWamF9JD8II2mzdjD81 + 150FCYEC8W0o@FfUaf38n329EII0WW@jYEe2KGmF_@V8GIIoh@@V4199XV_@VabaaWt@@zGM + I6Qz680AAKQRJ305a4Xjj9WqoKHocq8j2I0mMJhq41GosMZaiK4QJG3QQQR4j081DfDHKqqI + Tt48WWW1jfj9H0K01qsse103W0QJZa8WG19jDRI94980jIAQ1e920evfi0W4A8sc6M1ORCGQ + IUq0O00WQIps2WGer502008qQ2G000PQRR9qQFga9609001nqGlB5i2o1DcLq4GXqC04d0nW + 000Y2TvOenWEIGY948ea05QBzWBTC8tQEc9KZwW7fG1JIxfWSDF8cdA0200K3G2G001Q8TZc + 0IOrW3EcZWb2qX10004WGWF6E0900uq3D89008Bo2MJW0H010T3KmXg5a9w1XnQW000Wk4Ru + jW5YkoaJ3j8XW2o2kW0sK8dW3Y0W09300nEfmRb4WG003200K419qob1f4WGYk6CbH3fHppD + Z6i9X1TDWm_1CK7018400U_CZYIBedW3of2Yv@AelZG6VOZS2E8WF9g6eW1CQOC46IRWaqEq + 128000A0W01OeJO36loWtbP8Ak3Q7i0G000IG00g7m01200n9WmTX44wP1PcJmEo6W20084b + 46EXc0rPuuY2o9011020v4eG0e7aJG4TljGI_5aJG3r0OGE164KNDB5t0070WD7OG800mO3D + Cht2LFem_24qMd1FeaG7L8qIG1rbFIEeOiCW251Kmw6A80208F080C00020WOcY3cpLXZxQ8 + 4BLg7uWq0su9Q5E9HXs0AeWw4cF0X14IeJ040100awm1v4SGaa600WWCdWFsOeXS2m87z3Q7 + m02024B8K040002003np2HL06C2019fEHm18q8N1NxWH0E7i9p4fEG1eG8WPN8etF38040q9 + W1j6OmJ4Bql114008040249G11kUHpcDiQ03DCWGWwNaXn5hYU01I0WzzNuSK2W000aJG2N7 + W080G02GCOj2S09080200040WWonjWO88G100mQ0BKo41j8eHTu6iEe8zZe0e00WxYF8UR4Q + wf0G10091K0W2W24088P3W0e00WtRSeWW4c0mWAON8d0B_aRa4NDe5c2W140quj1Z0Gm7q40 + 4G8e1X48000Dt11T7aml0EW000O_73QJkWtMKW000H8Yw020GAFM3e100aW0142000012KjD + 17YWmk0B06a0fHO3oLuW7SP0O00no09SM12Da3og3X09088TH5I5mWS2AOpW902I0SA06NNS + GQ08aJm2H_eHjAFC004Y0W0U4GXHgdO505wPOXo0Eubc30484aJW1VFWGQ2Qq9sBZ2G029GW + M4Auwe5UDWXyDKeT02W00Wi8b31dmGhFDiYb7XJ8o5s5K3G5LTOGKF6yz13b34IG19yAG5@1 + OnL0K48H130O021Gmm0YuC09UvsZAASeqW2IWzW7uqv1732df0G8A1pCZGBW4KT02G000400 + Wq@Y3020Ww1mWT0AOV236OXWDT88xy3EWdWXhFug532fmXe1I8B3DG000yn420O00YdWWq4A + eA44w4WXC4AOc23G000S1J1XDPGd2E4hg1BdHm3PDSmG6@FSHdDCCHz3G0W0020080e0OEYC + 4040KMH138R0010Ws2A0m00mc0AG400e716YAOYGhn0IoKYKa45f192II2oaaa44QD1a4Wie + D99YKWaK9199G20G4WaW81UBH2IGYi0X58B89IoW41Y59I2IGaW548919HMIc0Waa0189fKI + 2Ia091KdQ1I022aiaa89P31oIIYe4e1999RXMxWaaa48B99fgI0P99XGht0IoIY0a059192I + 2GYa4aaG998HGI21iW50DI2IN2G0GIIos99GsMI240a413B8U02I40f9IWIQ2aWa4B9892QI + M4i542jk0A999AWaa0O89LGW1aWaa8R18H2GYYaja0918XGhF0IIIGuhC4Qz7TFOGNAC0G0G + Oe27IBfXg088j62AvmWX6EudZ54001ieu5XX93808W6cfeEY2AFV10104n5jGgO74Qt1dvnm + 8pNS3G111eG508qaq74000020400010800GV2A4YW1DvNG8D5yhJ118RmT_7aPt4JNu0G00Y + x1yesc6YJeYRwUuR19Q3010100nOTmyCfaJG1xwanIYcG020eW85_MuXy3YO8W32VGXViOOO + xAYaYau4ieH026w7XO1EecX208024E01r0KmF06a6M10204MR0XrBmuV0IoTJXS2se6w2W2G + seWaaaP189JKIIa44aAOB9HIYa09099DQ2gyd0Waiq@VGW0aa4B9898WaC4999H3GI2a5a49 + 199oo6IjVK0aaa49OQI4baa898fbWj16i4a89905Dj1baaGY848D891GGIYWWaa7H88qQE8O + 181IKIYj54G_A4W45W4919fIsIIa089j5K0G7oG4aaaC9P9H22IYeW409398IGW0P19BIGIG + a0W5yA01ab9aIHX0WaaW011IaaiiKGW1RLNGss7811912aaKm95KxT1XMlo6_8qgn5bZd0W4 + 000200WGW0oSeW59C8D06w8vWeIqe03EITW2K8IJG@stC8D8pxVRJQiLEfvaDPRc0asJoizN + BZtMmcdjDDNQEPNtU6ePj9GRTRJiisXWyibR0ACYZjkCB0GbamsgjD0WZAGhpxU08j9XQRRR + 0mPC0RPvp4miCWjjCT0G9eWstji0iPg0RptpC000eRsss4400WPRRR840G0ijjzRl64Qz64j + 19W1000daY0I02f920300I040Xi1a49W1OW0GI14G98810WGana500002152o0008YA2G2OB + 1I09BrXiD1GYa008qYeW4IeC0OcWa4HG02mM0g6GKDWGR0068824eDq88a4e3n6GvCIWGeeM + jjCGaaa0rss6GIII0JRRBA999YbjjQcaa2jU37819E0i011Wc860a4XOHgm0I0qYb921CfH2 + XL90I340f02X1C00i44a4aaWmGo8I835GA21Isc84K2GW2Q1GG29XQIi1GCWa000MbWaGaKW + 4anaYfam44mII24IPIWO3q6794GQi501Z4W88WDRRB499Duijj54aaamosc6IIIWORRB6f99 + XMl1I202NWKaK811W2GIoMa240Xj9R2IQWDrc8DLI4aWreC951002eKqo7W101OJPJ5WaY0e + Xj5F0040AfCPB0004WaeD90022GI6Y2G7r4ma40G0MKYss408000IQRH44i009ijfww2GI30 + 000AHII32000G99990000maaaKN51qaa42jM3RpyW0j4b0dOHHoMI203e1QSW802H2ia6W81 + 1Gmbe04291jksp04580ImQS1G4G0m2eMYuWW0_zLR39240_dSXXa809_twpJ2Xv8UtJ80I2I + IuB303I00YydHZ79X0KuxI4da108uJfy7IWaWqVRr481Xxt@FGYaamV@VF8IIImz@@F88999 + qQDW4m8hqcqcGI082RxR49e0Oa9jHMX0WXiaaj0Y2D1e6DBj0mm66naaae9B91RoIgWCX9B9 + f9I0WD9RjfHI0WaC0scDz1Oc66Racs00O00PRQR1GeXWQJMT20aq2i9vn3W6W1scY910B12Q + RuZ2000YSrscIyVX12004WsssA0108qQUs0EcrQi8ekS23GYwOfuac66o9YnQ0fl4AUQ_agi + nG880m42IyWq1n8qGq0Be00WeH13o7WX5zMvK78Qxf0I020@jPW101WV6GW0W00004WE0C04 + 4Wmp29020G8eW208C4CFG1t1K0GG2Yc38O1p2UYRXXfDe4W4sjqaL7Q040G0WW0WD088nt2W + 84aqUd14000JV010P00TFiGGSAiY03dVgGrpAW000ePu2QfuWC7Q8WYHUwk0011W0G00gRi0 + 8W05LNTG71BqFe1NAGGg04K@M10G10wfuXkh9O2W2MXpWc4EezW2M9mWS2MuiJ4wd0Zvn900 + 0O0GG1004000RG86@c0181000008810S901zUIGMJ4q0G122022VGXa7CemX46O71008aT1O + 00I0YRVoOFZ8gnm340040IG0sRjW5G9eyy8IusXgGs85W6c63XqBf1110G22408B08A05oEW + 02220lBlGB14qQu1G0G0gQm02004BFO0I00XmCGO0W24400yCg1hdeGWwsWW00G000030IYS + 2ee4046qY1O080fgQmLe6W0048d074001bJm5XMJZW0XWQ0MOYP6oX4XQ8ae7z6MS0XtwB8@ + T2QmGXp2E8BS2o9uXKbZuf3DY8nWRoF0400204G0W00G@Sa0GI2m_08G202md5BawW1a0000 + XG0qam1LrQmsa78111edu4QTWYdahO0080M00ibW10140oH9YRBQO513Y@_WD08eUp2G020K + 2G1tFimSlbaJ082GW0QZeWrUW060mGfsCSwY3PkV040W10000m102g2W0A001H30He6Aq9T3 + bxW2iBG010W080090020SU12nMiGp0BimP32810YI81X0W0fwHn51HaJW5j5SGuhOG2W08AW + 3w0WW3QD8eW20Y00SWK4nPGmjg70900O502C000cg01P1am24Dq6W19AUGthnqth1RHe0W00 + Wi2Eud63k5NXpQH8Yn2o1mWLu80200OHaIC0GHv4G0184Wl3KOjt3IuE10144R3FnlhA0200 + W1G1GE1EKYz1BJjHlD6a8Y8I2K060W0d0000004Y@mWDTCOn076LvWa28u292sQmW@4A0CW2 + m0040q00u3026t9Xk5MuJXAM82ar088l430W02aJG1JnKGE1R4Km1hETGiw60400en42s6mW + BJOuWp3gIFaiVsO7920200ytI1X2hGjG9q9u5F8PG42RqVE2RYaGx9jiSm1j5SGw55qsB1Bf + OoHdPaGG4n9SJmcByJG1Y0002BWWX8KW100m94RajS1F3vnC1YaJm5@VOmk05W400G00WGB1 + 6yRY1Xbzm704SUj2fX@G7QJqdm19msm00iKO91200WoJs02000G0408G30KXm1p3emh1D08G + 0uza56uX10108xZPGP29qxR3PcXHdDUqUh1JzImRt7G020a104npcB8200110GqI16ynK309 + 80wc8Y5TFO003c0laeEkep63oIlWBBOeSY3IGmWVlB01W0m358yQJ2zOFnAu7SQ231eTms9O + 4QD6IIgIiaae0111GIGIc4ii0218O2Y208b40OHIIY4ai4919BSGGIaaaa8o98HIG22a4a49 + F91aaW6A9010IoOYWaW49B192GI2i4aaO999HG2a810B9LL2Y2W0iaaWA0991IGI3XaaCDw2 + KIII20aaCLL5olkWGhxuSI281A90I2I2aaX0BBH800IGeaaj00e1YacaCQ02ab5481191IoM + 2W0041919T2KW44a49918IMI2a4W4O9990G2IWWa418991OWa48999H2GIYW4aKuh6GGG2gj + 02GH2a4_g1PRdGuhbilE1NfdGiBFi2W23iLmv5B4DD3Rcuma0BSKl7XMNIT698020u9j2G0W + 44A@1r34nfR5KPm1G400skXWfHEueZ3oauW01A0W40mQ8GSVd1b6cm0XU4A010902_fGXmB8 + u664080WKVu1ztjX0G0WWJkuHf364eY56G8C14YJW21000hQuGw04yM37l1emw170840ei37 + o48Xo9f8rJPA@RZu1Auue904004pA1bIXK11QK3m10280oBpYamn8Rj4I18Yn4qeoQ8o9G3W + daa8899XIGINu11I02IeWaa80O9H6IIY4B8fQ08089BPTj48999ezZ28KIIYa40HIoIYa044 + 1PR1T0G0P918I2JGaaYa8991Wac0iAa22EX04aW44099HIG2L522XMJ0a0a011999YS08981 + I2I29YeH704K3W12IIoaaaaG819HGoI2i4W49MGGWaai8981JI2MYbaa48911III04aia2Ef + 0mGIIW4a4OR19H2IIYCaW4989ewJEeJ0209895So1DcSG3t44SIDbA0nh7KymW4BHnHgFQ4E + nBediraalcPuGLoswNcl0vOOpVvwsaPePbduRvibB9c6FRFMgpaGyczDupPpWxwsoiNX7YhT + Bs039O7hRzMma2DWzLRR86abWUibz0EPP3Lsss0OQ2G@_tk9P982RzR_8XjW3abOB9mc41sZ + ib1WsgD8qw2y18002QRps24002iDRB30XMd11202u2H7mXW0L4580X2mW0GW21G09aW1M2W2 + 0C4KG34G4W1HGeOA00Jn1X01b0913221q8c02ca9GKIWCJ0YG800G05O2G1G8A06ie8He400 + i12i140m8a0G41m0B081G2IBo8Ki108Z4n4AiKRBZ4999sDeDGJRRA8991YXjjO4aaGXjj5Q + D6U383S2OG1g491E00D0HKG41m0043RWWOHGWK1240MWWs084V02208J08e9201G1mOaE10m + 2CCW08j6a00K0W040IKqW8I204IIhaOA9XC0000AaTI0a85W4o78cGa0n6IqEIIYWOZHJ688 + IIOVssMfIIQeHRRA8891PgW3msM65Qj70IYR5McA8182H9RIA44a0XiXi2G22XLsYeH04YWL + c696G8QIOBsWa0G81eHNI124a4ajCD100mag598pAa0XjfD0G00Wmas08880IQQg4488I4GG + s000810f0RG000amcjhD0GG0G4ss6000G4H41XLNGAB44H41XMNGrr44Qz56una103216h6a + b8149k2FZw4mA0Qa52D2WIGmI4v122I62L46202S9eDMuZWWaG4iA94042aSVxG2WIi4igPQ + 2P0G1qjkjdC81SCKMs0444ae7FH7ji0Cn_6HDIq0iuF11C00G0mV6uFa100vV@@Ea899vr@@ + FYaaimx@VEIIIIm@@@U8891o@@7QD60GJGHIJII0fa0WfD9vaY4vmcqefO05KKIYs4V5YcKY + Ya64v0Q0AIJQWY0WXWXlH8ZJW06a4fm6a0easiD0QJq2RZcc850PY9wNI0454W8jjj8X10Hj + 9y91mC01qasi9P900IJwc08481j9QJ1000HDQRJ18001_vk1ORRR5W008ehjLA00GerP800W + OkA7khMcmGW9AxQI6uZb08uVu2wdEbMuufMWFMKOYnQPuf074000KIa2Ng8Hk0CaJm9F1GGK + P4CA04BQG0100Wm7AO31Ewu4XB3Y8Zs6scMYd5A1102m2HBKQG2j0G0900WL6902W0qj06G0 + 80uR05U5e14004010Wg1W0G000fmPmpDDC1H5h3VIP25ic9354qGE17yYh1HMPW000e3JD00 + 009G00WHTD8DW32hB14000d0Sm31YaEO5vvTmI7Xa3020Y0000H04N02rJUGkv5Sb03lPKGC + GFCKG7vvfnud8CHH3xIcmxh5qkQ2fHV0W00el0O0a01Gi0HSTW2fHR3IG2W2V98bt38800Ko + 018000IGuW3tDe_17U0eWZ@EeXP2G200LuO1GI00s8eZK0Q8I5IG2I08020W110GE1K48O1P + W4HE16qSQ1v4S0W5KWS2690Y4o98YGhr0400OD05S922fqoGQ4Gifc2LuHn62N4F68XJyHr0 + 7iOC3T5KmP06C7G2TQNGD19yE91l24Hb06qb91BT0HiVTyln6v4mGd07W000CD06obCX64Au + PU2I9uW6RU8QW823WW89T8WpKW021KL220W00wSnXK4Au60240000204ee03E6hWn1C8fG3W + A00a601ZcNnWTDS0A7fEK1708WQ0M8T02IHWWjnB0840GZk9iJ02400W6yG12080VvoGf27y + 4B6PDAJD45y301H3K0WG0aRm900Y0GKY5Sv830200NHEXboF8Bc2o0W0210G@mImHlk4_JA5 + 4O0100XSUY0W00vSD6y2W2fmf0800WQhFO3X9ANncDCUOl14UXu01010fEKmkhB45G1jEOGE + 160H00OTT3024Wa7o44003_2vYxXk84HCa800abW2e840UskWw4M8J13W804qDm1W100_0dW + 6MA85W201220G108lfA0208SdGFQ002M1U1W00457zGAr8W00GCSW30K000G00Ad05kcQYIX + V9EXAwWvW02889d2W0010A10uHhB8000TSI230K0W10WM2CG440mogNC0mF4W00E5812028j + s8H@DG42Y1RzQ0W00WD2OOUSG2u47W010Z3GmAF4CPg3NdEnZ4Ci0127ZkHE1qycn30480lF + mXmNhu4W2McYWvL3fBW32nu622K00000wSaWy6A0W00OW8404000204o@B8a@X5W600sUeWU + @HuRA2A1kWwHM0180mq3FCRA3x2WGsFO0802Qlt360NX1ACW010HU14C7G1bKS06G0WFA8O9 + 02WW00Y0009t428410CoA3@CGG495iA0270GmH48aNG2XJW2ICWWWaKuDe3E4eWAaE00000A + 10WT4Ie6W30840yzq3W2000G01qsL2Xw4o8094QD6GM224Cae893PGI2IcC5aC28092I22a5 + aa8HII2Wba4B0986mGGaaba85P8HIIYcWCX49911a4a0A9110IYo2Wba499922GIOW450rhI + WL8D12soMW4WagJD1oIIGaaWa8B99WWaaiww2g1eWeLB0P19PerVW04bK901DKIoQCa4W8AJ + 8Hc20Y0W449P19IIa4909DT2G0BP8e@M90P099GW6IiX0a801IQhk0YaeS88980IIo00a409 + H98GKG2a409jkYGWj6W4aa4119P2s74_w29mQGuhX0800ehBDgUXXI6Q0G10mz6I42F4@S0H + r4IKYr2hVa1m00ar_E00O0mX05SD37XpnnS_6y8i630q2Y40WvU8umO3W900KOG441W0cuMX + ZB8Oxz3000GWW008Sh4UpcYJ0MW080mv1M4QD70J0067GXfc8OS03QOG120GWbCS1e88Wm1K + 8d02gIWZDwF8qwR6_abc3Kek1GY@1bm9iOoF7oyaZX9WOuT624OXlhg9dWAozW0GY225UKW0 + WX4290822GIab4a8HIIA2Q2Q@e0GIIGab0a0991r_n1It6Ig2X188f90G8IaaaaA0IIZaWaK + A_88189fA43iaaa4S218999hF11oI2ILYSGerSWWaak6030G4IYiaa59I8PD078H00gJW24a + m48999HQmIId0402IIAd02aiDb8981G2I0Wa4a49919GIQI4a0WqhD1z5OGRr8GGIGgJ02Gm + II6QD4v4OGU154QDBdCmW810WY5Ouz17ItOXhAE0W00GX88i8G1PJGGu4zWj4odrkD8vQIRs + o_UG0JbHPlPpmYaddjl5hYWR9rjrOVgo5enpY@4E1MZ1hUtIC9P3XSVfV8bCD1VRRpq4qYaj + lDRmR00aosijaP112Rnss81m29Rsos42iFX9RlRWGsM0jjlD9GoL0_sQi1400GMssMD10sss + i10000wRBqQ20ORRFwB1XMV1B3088fIioX00W443WWo224mJa3G3100908Lc11348Or0072A + 1072G2840b8oCW9040An0Wc44o49PI0000Qas08H0000PRW181920b50a1W08b0anWKp8Gs8 + 51K244GR4G2890Ii9WHZaeQ9iKRRZSer9qMj14JRRr889H2RRBqQCCcIcuW4W6KKRXOAL0Mw + 9aI391G0k0AjnG2F0gkr98490nWc0o6W40aGw1m7G2828CeG011908G1HI10GGW0411Y0XG8 + ICa02oac8O0m20JARGoMocIQI30Ph0I890GYiHgRa00WnKYWC0I4amsijjIQhk0Baaa8nqsi + D2IYaOPxZW22jM3Waa0ECbif0GI0bssYj809GIJ9s60W09AzORhX8h0hLRR0W0ma0DDWD0IG + GmqIaA0180GPOB00091KOJa5008DWD4_E1C0jfHI0004Wk6Dj0W00e4fjD00G40rasa00891 + IIRZW00101fjnMGWIJIoGhD090000GGoGhBey232j_2V39sWX810N3WYI00K0dT62C8I00dE + 8ac0100E24P0000BEiCBHWWD0Ge5E12aI0MQZt3Y3WUyj4Q338IIa_bW1W999O3MuI04c4CV + RP3GGG0Ok3Q3I20We@He7090IytAWca408e@3w7M20ayl@@7YsgBmZaaKRr4Wiaa4y_@l7II + oQ088qwBW0aGgscra0B0A2JIR41W98afDHR1sW0ica9TI004DMDeD40k40Xcsae0Q30wRIZW + 15D2fj9Q1j800jjPVHc088qcDjH9o04JasqW1J39PoJI109D1QJJQY4040CjLOJ04H4ssoD1 + 28J0QR6q2800WQQh61s010XMN0000esg98qQDEBSeZr_P3jGss210011hElH_98aWI2R1GmV + 44KSp3lrmGrDLyiTB@2ymA04Kip3Dgi0W50Wx4OeoW5QOHXy1lvD0AQsKXn1SOvj38000qsW + 4T5e0I0001400JcUmdQSS@DE@7WW008Wu1M0W00WG02YMJNeZp2UMzWMr8ufP2_AyWRM9ORl + 4QjZXAEvPZK3IH8YB2H8d04I9eWS2C0410I@04OG00eQx26xiW5x8W0G0GE1903000m00Ger + wKRW1r0SmDWee002eG26oaWZ0FG9d0CQD8XS2M8G86AviW_7I0480Gx3480G00100mlKDSgB + 2VadJgLJW000OU03sraW8988pN2sGu211W0JNf0010hy2C8V03g_ZWYYNOx32ITuWqrk9dW2 + IA@WS2WeCw94002aJ03K200o9OXCfL8d04YSCX4VhfUW2ULqWBoFeZW7G00005004000nC38 + CyW1FXK0210Xk8KuNWAEi0bGht8315oSWXQ0G8Ml2010GS2W1400GWGG04D37ljPHQqoK3W3 + FqVGQ0W4RY1HI4Htg5iIG49CWGd0GCaX2H3S1808WI5O8IW20804i@n79DNmbV9a801DwI0W + 00XQ3A0W0aGF7nC2n52000K0G04uG2J1Smg56aw71PRK0400Xh4S0201G8K4qRY4vJRmnp4i + K11z0iG66qK7m2G000sNkWg08G4000402WN3OONW4G0010W00U3W3WY00Ca@1WG00sz9eb01 + 9N35wRlWaZBeam9_yXe6Y_8SY68802qbT3pfkGP17O000ek130H80SMG5DJS0120WwX9OmS3 + oMKaK7mOTZ480G04eW2XlVmbcAG200yV06wusWb@V8_f9QGwZk0_OpT2I5GYA3K8dW4M3eXH + 9C8yW8cZHXYcQ9@uB40008G0Gem_8U01YY0O0K10OPlBK4W2DmKn4uxS701VzZmA6DqA23Hs + uGP14iQW1je@nO6g4d05Z3OGD07SqS1B4imi0A4K02BbUmk2Dybm5XMRqu64KGG2010004G0 + qVS1RhgGU08iMI4G800c1uW3ZC81252EXeSjJOJ020600SHm1dMKmC04CFJ4hkJGD05q7M1d + nLGD0804480000OP06080084M2e000azZEb7LG58C0G0G0G000401WIV8G003ux070005eGf + 5_8gWwCW0600GID5yPm12G0GMlBX5O3999DwrY003Y0V0Omj04S5m2DLJmRQAa8W3D4OGUI5 + aV01XKTGI@4CM02BPiGF29iCI4XMZ1aai4GB9AIYo2aWea9199XI2IcW444H919Iaaa8B99H + IG2YW0a491P9QI2IaaaG810950T1aWaa8T090G2IYaa049109IIIGaW0a0999GaaW519190I + IYKLJ081fL_h5qMj1fgYGQqF4Qz5XjM09H99MMGI04iag101H999Qb4a8R99jH018888HoII + Y6W0iJW4aGWb8991L22IGt06099fH0I2IUh40a4aL9951GI2Y2280IGIG11ASIW1DrUGE198 + 1999yLFAAIZ668WW00m00G0I008hv3wDPYoB_80sAA8GZ2p8OFW4W010y1W13lTGk5BiM12x + kRGG7CKXy6P4Knf66CP11@r1Y0W0WOOE0200KqR6S6W29Xe0G000G0000C00Qg3XVfHOvg20 + 2208W10G020mDCiaso29xDosM5qUG6V0y0222WS2M0W0WGE14KHW4v4KIPCUCFZDV5mm0HNy + 6M9n9GHrHNClr130m110WWG4ye1CG2jc44a4bG999mGII2i0a0929Ha_4a6D10989HQII64G + 1aa4aR@mWYh9ez328399HImIgF42GI2oN3012JII2kb0a44ifeKGQ05G8P8fAa2c1XWqeTGM + II2aaa41899fuxHD06G5aa0318foIIGaeW4r0G0iWa48I22jyJ0GIGoE18GoIIId04G2II2W + aWGBB48090JIGIG__4GKIGEQ038888K3012IIGA8m0F9A1v4W0oIWWS2a8i@GALGXU7COY97 + cUdXCTG8s93W0Y0y5G1XTG0002WpYCG900GS5uaw05mVYzXbir80G1IttscbC8C6I@RU@uKW + 9biPR@C7F1baB@VQCiqn__i5OMo_XV_IYOVl82ffR_CPi23RPrsO0GWWiLPRG0YacMljj8O3 + GZrsts820WGsstYf3C10BRR_00i01jjOV102W1_cjb1WsgH8qw3GRRRFwx1XMh11O108J0Jq + be48asq2ZGG44000eK1O20P4O80e0W2m34G0I8G20Gv42280W0OGfD01H0fa4Y0Wm4D0m004 + PPIMO8m20eP1IW4101W9b110024CjjbnWac94sac1K2X4QR0c29PGGaD83Za09AiT3w22js1 + RRRZ89992jU3HAv10O08e9BzWfe1400G0Go2GOOJR0323KOER1XIG0GY02IQ00H3IY09P2O8 + 1GI2w0YW040aa40na240pIO40oJ25GAGIC1AI54448W00fWbPQVX8191Wjaf0aW44o6wmOII + 24JBVv8899qQ7cAeXGhtG2IUlcMM18109OJRR1W048beX40II2escMb2MIWiss408012231c + qW000053RR0ie4Wijj5W42aG9D99H22I2ccce10W00JGpa00618C9Gw0000H9IGQ00000e99 + 112020aas010012AIRq0000WIIAqw5grWWGh1n54N00012mNocaCW00GsOAVZKW9n141s102 + W04Cy540WsIPs0H0J39W9iiM4X1004Gej00005eJ2oG2YaWq7BH012IWsjfjWO18Xp4pM4ai + 44c@txWai48wVoxPGIY5tlZt991m2@@sp1b088@tMD2XMV0IIIIm@@@XMx164Y4raca0A091 + OQQoCjjHQCR9JA600ibseDL21AjbWfF1Wt208caq4KH990JRI46e8O81nLB540IBD9RB02CW + Xs8jDJ2M0Gpss452IA8RRRA0020KRRRIe00GWfjDR0W28WsciDO0Rhc0f000jLhm@544QTE5 + 8rG5D5C3I5Vb1I8_eqGa6r2XmOfK0400ebW72GfWDRSuca3wqPXKu6QRb7UEuZUKQeFl3Q8O + XR3O8d0asXC188G035e0I0IZ228WW0400000K0I240000990S201NnO0406WdXYOM67_u3X5 + Vx9J04WI0WqP43ttc0810Wj6BePW2W000CRQ1vhUGWl8m0000880mIfCS1m1BjTGvV0DnP1N + 7emBlCC9v1BAG040GW608G400mzECSTg1RRUGE1AS3e1Xwa3830fQ08Oc03c9tWG1AW000OP + O502I0uuA3MIeWqjCeRx2Q2WWAxAulKZ2SgYC4AOmq4M6Tax8y9j0P27mWmZA8Ft3oV_WV0A + OhN3sa0XM9CePQ208W08G108O12810G4gG1vJVm00AK8t45du220mWYlLOl43sRmWW2C8d0A + 4012bJG12G00o9uX_bl94nEwubWxnWeJW36yjX0fB0010mlZ6G8K08MW4U0mWocTuE6FwAOX + S2gO5W2gKkWU488XX2sqp0GG0IdHQmQ8508108072s@kWs1C8n0425z080002008w5z000q0 + H2SmRvA4dW4Z0amd6U4S03RHgGVRPG00W0GG0mJo4SK12W020Yq8YVOIfx1Fw8WWI2Cek66Q + CXW6pHWG00GI06awm1z3JmDC9S801l4SGq0NaKF29b3Z10YWUTS8dC2MFWWE1O0KW00000aE + 4BejW204000H020G00HZpCKGW4XMN4000aWe9eVb3QGs003aGp3eGG74S401F3q0H0020G80 + v7ymI07KgZ2@iSJ537iVm1I204IQeWbQA0200Gd54SPX15eSmC25G001uZ24szhX6@KfX8MG + 020iH0184012Be00o010210M9VXjbHeLI3ct0102G0l6amcCOybBAj7Q1001W118ORb32k01 + W001vDaWW40WyoB0100040040W00J4GmZk408Wm8c03m20000018YW2wMWWj1KuJ03YwnWtR + Q8n3Io9eWs2c8dW4G000aJG10001Q92XS2GOX22o9mWHWC89X9Q89ZS2W84YCQZGXyhUu232 + 29KX9FO8VW5UXfXFiMe9bGwUecY2SW019mL0CW040ug02Aym00100n5OG715iBX51ScJ9qTy + tm1HNi020004W01ZOamxF548LAv4Cp91FG00086I36JvX@3Au9Y3obsWG1Ae1f5wU5YmBou0 + ALo9G1GA00b2qW0a4XY0KOw12UpG10220n5W0010WFDMG000GqPA4RG2JaOGeElSOW182002 + 2011008L4O0u00afO88XZ3YwmWdXAOCN3Ut6Xb288pe36001W300LDymK2YawG53gKmxC7qx + W3bQNma288000T805G0I10G00iM674400C0y1NiWHeEnWCabG199fq2mI0aaa8A99HYIIga0 + a09O98oIa4O9992IIG441C811PnGII2a6a4H9H86MIG4088HmMI2W0a1v8OXtLB88r20KGIY + 448HMIIIuh7mIIQYWaG4989OIIIIqaa42jc6abea809OXMIMY0a46P91PD09WW490MIM24a4 + 49H93G0G2iaca0881H42MY5a441GII4aaa098PGM2IW0aa49011I2GGa4ea8918WaiaK9989 + 02Io22GW4a4Cf999GII2PqsmHt54_Q9bAamw29afJ10A0061eWi8Mu1c2oZuXg2X8CibcQYW + O0COnf4gI@WBOQuF_3YisXQ2EOmZ3ALyYMO_vAj2sRS201007AXm464iud33oz0K40WKBxfY + yDE2eXa1WuYE2g4uXW6Yuhc9wayeMeOgi9K2rn5G0G27M4IY0780G0OW6EEJGcSfgWIII2aa + 059911IGImaaiaKuH2Iaaa8998HQmomW4a49f9gGhFG9999II048B99XWG0R98fDH803899I + 0JIWaaa890I21X0G2IILNNGZ95WW8i499D9II0a4HU8DQIGoIIM3m2a14b8981GGImAdW3aa + 4W9389G2IIYC4WWUiBG0199IIW48A99H3G0w88n9080B81922IoI08en474aaaaJm1PR3HE1 + dKgG6lHiGF04S1245ZPmU38i5m1txam00TC_G5fEGXi9W9OxVRcEbYTjcl99Q@WmqMYjjPGR + IxTo_lQH58CvNsc6x14ihvR7bj4amdyj9MM62HUNc5IIh2msMjDGY2Qvfrs6MAaffLRRB5CY + 0G_ijD2000ajjjPI00gjQ3W0jjPR100W0scjj1esgD0140CRRR3W060r0KW00ijGhx081000 + 9454X0G83mPW4mG02aB328108OP0GC08s6N0L2O0GR3GH91000DX0hW400062C4KmWWam220 + 20893J4HB028Dj12W008H6cX4K4WWmMjjCIaaaGqsc61IIG0RRRB0999YjjDjLV04aa4ncMs + CIIGaG3RoM88HIYjDPRa419XjXMd1c0s2JIYW403GXBG83K8iHOi48QKGMfWGWWW0NaUBXG4 + 90moe5040408RmG0GAI5f4TX81CH3191Ggj11AXf81H4G90YY4a00KY01GGH00AI3sssq4II + I38RRfjQ28RRJ3999Gijjrw04OPBRJ98D9ebbDBaaY8noMiDIIWaORRgW22jM3YWa4EfWjf8 + I02aomdj091GQIRq6Wa01haPBfa888g5HJ2Wa0W0lC81GI0GGoMa8098GGhPZK8800KQIqK4 + 0a90iGJIG0c2W49f908O2G2caNQhkWGh90G999IG004maajLlWoIIoW_AWca000009JII0r0 + G0QI0WGhp01t488H30mSeMe6Z10G30Z2H2W0Wt4YkG20amGKzP0a2IY1Y@L4GO939mzA81ea + WWyyn0a0YWnSpsGGYWW_F2POG2IYm84ja8911trGs0Dq40s@@_Waa48x@@tMD1k@@v1JIIsM + z1_zz@Rhc0zl@Z8f89y@t@Z4ac4S@xl7IImGhtG8R0AIIQR0De5A8f9HsW0W1aaafNJ0YcpQ + acBGa0WGqasI022G6JQRZBW11e9fD2YK0iacaA1K0aXbaEj1B324GIss680G1iPJQ3651b4D + fD50005gjjDpfs0t400dJGGRrCGR10W00scfj1eGhF010jTeriavn2h@WGEV7SGRRRofH418 + 4ua22000M1eWm2Eu_u42HPXxkEuF0540400001OEe7oAgb_OJ81l4010W4e02x2cmPAFGY00 + 0100HJBC0G0G8d04wDZWC0GORd8YK2cfMSugW22R2XiMNu9120900Dg72jAEnjgAC0GI2W00 + 2cOX65EWe00W80004000j0GW0001080120G0Q201C000H0KW240Y33CeD03IhnWwXDuC19gY + 0X80L1I20020WaV288dW6_wpWIaG8702o9GXw9E02400200YcBBW000H614aJ01010WU35XM + q39m9GG080ChL2XMKGB3L4AG3v4KmHk6ixK2DdDHjhjaB56n0GG3Y5S9r3N0imYODiVX2ZOW + GS24CCG2fDmnKLCqSc802004I2WK411W0YWgqWXEcJeX02I4XWuZDeNW201W0DMB1@XJ0400 + aXhD0009O12HWWW0uwpCI4n4Wa09zLKGE1CK3t12400o98Xh3C8dW36IqWS2ceM34o9GYkKE + 8dW9IyL390011S6HlsDqyr62800EZ0Ys0e8n2AY8hYGOq0G00ny2A4PS3fl1X000YF0OG800 + mfkAKE03D1mGvVqSlf1TOemy1Aa601n1y0W00W@i9GGG0mb5FKgT6v4iJQD5W404O2X4UGqW + l0c86332dmWL3MuYM4_PEXD7w8Q4CITe241G0G00IoVO4W10WjAeGeE4C0W1mW0W0080T8J2 + v5OmnxDiPU2TAIGE1L4Qz6xyOmmB54HJ1ngbW630WoTUu4q2090OaKG1NvI04WW001440G0W + 080W4CW5NrkpcR6040422W0m005W100uT234004Ciw1x4iGRZDiFB1X9GmksECIm2xCpm00s + 01G8uu_3c50XN980810mC6AK1j10100MAmWR0AuS03G000kb05fEum4uYaw06ZWOG_t5SaG2 + O810_781A800LDCnKi6e40000G0mAF5q8n4W0W0YCgWriqPs23o9WWW3K0190Gi2AaJG2tEa + 0802WK4CeH33UZ_XQGOenbAkzJYu4eeE452_eW7VC8K0201G4SC33liWm0060q0000000A90 + W61MeN06UUGYe1O88iMwU0Zm_H8E120802EdI8tMcH76Y4m9813amH2AqDW14040UJfXW080 + Y00mgAH0100udW3s8WWzGQ9dWC65W04008l7mmKPDq@w3phemT05qh02@xVo00hqlS1zhKme + 5DKwc2H5SGJP7KoH1bRvGQv60110Of04ofmX@VJuqY22IeYgTsWW8Gm718K0k240G0Y6m04W + 02z0KG3040404OIX4UCxWx2Eeds4gc6X81Cumj9ITO5G000W002_0eXM2C0402GGNEyxW280 + W0QUmXPOMewg6A7O1W0G0Z0eml3F4gp5e10816II2Xa440PB9oIGMXea489A9mK6IY4481YI + 6Wia40929HI2I28ei4008BLa2IY4aa49GOI4iWa8X80mo0IYWa449S39MIGG4W0Xwac089O9 + III0aa4449914a4a899HrMD30191JLbXI088qwDGI2Jg4aa4AD89222IabaigG990IKIWfCa + 400Iwch40I0Q6a464C9HPoI2GWWae1099aJD1I00IaWaW8972GI20WaaW989900I22Caaa80 + I0YWaa491892GOIca4aA8e0H999IGI22VDXS2W0C9GIerWGu00ePf8YreYL0A0400H234044 + 00G10GU9AG000eMC2IceXlgMOre8IIYaSKGuzc20200CYl3bSem704aL32D0KW1000000043 + 00o1WW74HeQb7Ex8X9yLf2F7G0WWa1m1J0GG6050X00eKW2GO00KVG2W200AEeWk0Ce10242 + 000aa0vIf2s2ZXAzAe9R30100CbG4BDemD094dW5H3amK940GW4e4W2wu7XVvJui@4w2mWm8 + DuZ020289DPM3n3eGE14020WugnUAZX301W0HLxHL3q4g3CJbumHFNaWm6N1WG4044T5Dv4G + 1IJIIaaWaGD99HG2IYia4im33GQNGYa09HQII2aa44R191jLJ09919GII0aia68189Wca0C4 + 43WGIIY4aa00899I0I2kbaaDcG0989fgGK0B899I2GIi5aar0G0899XqeD0aaWGz95888HfB + V52Ef29919IMI0g1e0bbaW8H181IGIYai4CqQ28899H2GsO70381985D012989pfE11193IG + IIQvt0198RjLF1MGIGa4a4r0G0489fGhd0B99OerY4O62Fep1G00mAtC0800HDEM44G1nF4n + NOTq5G2fEGXb1F4PRBV6pmg0bzjuBA3m5qskbDDE2NVBsNkfncMPxIIcqZXwCDRB1adWqeb@ + @9wJI2mxssF8I3amsNjDDBAJPBrs6sGCWeLPRB0aKoGzjjD6000ajjjP4000GsscD000GGRR + sM4008mjPRR0180abRRR0680mijkD04G0WUssc01O00RxvGht044WCWWA4O222CM2mX08A1G + 8XHC8W08mWE4H0H08GG0II0G4i0IvWC10ac405I24a02G0A000BGm4C40G290O0WA8000aej + Gm504Haq602H02msso0III4PRRpO99H2ijDJ1a498qsiX1Ia44MgfjHc4a4hqos82oI2QPJR + 1H98HCjXLZW4LerS0BOc4I8004a1644ee0a2YWG4YA122m0PO14GHG442IaKCuuE21932q4G + 0X4000AmaGG0q4ACK44eo0a40Q3Y0GI8KCyBG049K2aY89W6LbWqDRxB699Duijj5aaaa0ss + M6IIIY0RRB6A99QONBrM98HIebrQB4419nGjiD2aaaOn6s6HJKI8qQD00IGwqsM62881GRPR + Y2048ejfgKc0HyjbQqC00OfjPRG00W0q69j11G02R60WW0100PRJ110X4XIBQI2a4008j9PJ + G2p0st69180G2QHaa20XMJ0911000OIaa40000CHII22004GMz4000A5II2004009f89HlGG + er70c408qwCGJ1E1A0WWirXeB020Kqcw0L2410SRY7k008W0Wtl0300W44xBZ1GI080t@40S + RBGPaCFG24Qm6beC4e09GXqs6I0a0W1P0B00GIuKjbC0Af90@@@F8999I_@@SWaa8H@@xUGI + Yam_l@TA9IIot__V8KIIoB@_V49H9X@@yVaXaaWt@@zGI66QD76qWIqcqZPQ2JGQQIdj0D5i + fD9gMMs0dabAr8pYCqp491eH0KOGacamGI2iJRx3WWWfiWfD5e8Ce8fjj9406Ync_a9O0XWO + QQs6410G9jvI70000ADqw20GRRFZ11ORRR51008ejjLA0100gfDRB0080msCjDG100OZss60 + 0A08JRQBXMhIYMPaA22BrOmpSiC0WE9BFHIEJS2W30I002QaWSQSuh0DUhBZ100921DI1WXV + 1S0GI4ma2A0G000W04nb2TC24G2001IS2XkyIeik6MA8Yi8B8O32g3aaTo@1420mZC9G100e + AB50240ijw1J0OGI84yM02a000s3WWi0AGW40GE1NGWG0OK03kC0YmwiekX6G2000m408dW5 + g7mWSVRO2B2IGu0800W01H0Yhk0I000x1GmI040209uYd82pvWMxKuP1CIr33W001dGemQ38 + arq5P@QGLf8yAnBvv1JO074B01n9im9HUaxn2JmNm4YHLFW2890Gsy31W002L601800XY1C0 + 102GNv4S4H1W0a0kPJ1400Cn90n069KNG3je8Z0890a004v4GX00GWFoO8q13o9mX_bDupP4 + A1WWc4AOd3AcBsW4VTfkEEw4W120W0n5emQm9q0G1K200kZoZE1aOwX3kG0XmEu0400Oh1FW + 000eMJ5g@iWSJM8HN6YfmX61UedW5QJWYtTNe7WAQW_WjtQ08000200WxLYuDO4UNnWbbB02 + 01GdT9qMDAh60HQ0P01048DQ5U0n11O01RSsGe270400AcY2Yo9dHAGeRW5ITu21X00v4Km@ + Y5CFx1NvM0020oM6Ge_T2k2zWd380310GRD7KAH352GWA00W8mf9SYCghF20G00h8KGH1508 + H0v_Y4_Ij010G1RwKmO@5qVm2tfxmZE2DBW15TJm3BBaUx1TQRG_09SuW1J9O0W02adGaeLx + T2MQ3400GH7a04000208WPGmG6DQC2PAX8k3O00X0aQu_M3Q0n10A0GD5e0K0001030l5K08 + G000nW0NVmGP07aZY3020G6MmcWp8eI17o9GYw18OLo8YZfWs3EOAW4o9OYG288dWE2jsYf0 + 80808Gk0ASum2tQ0nIo6aUx15PmG26DjDY3Z20H214G000Qma9U801W100zlums9MSLX6r0y + mf1O4u41NUmn1iHiBW3xAmm0NNiNg854KnA0BG0028016s7u014003FOn746KgY6dgMmj4FC + f5399LY000os6Qen622Td0W40aRgjm0SA08008CG200014Y01J3iGz048000Q_0A01008G00 + uoW7kN0XW3ku703olbW1EW0G04IbHC4g01W4002W7XCwmfF2CY1WYQRDeK82G2G0KGq1dyM0 + 400WOQ8uiW3kq6XQZD87K7E2WWm2KuL@5sIWWn5M8KdOG60ogbbi029P12IoIar4b0H99HIK + GYaCa411I6aakbwK9Wa4q499P1II0naaie8G98Ho6I00HGPGg481P0GJQI2ia6WWK9W46W49 + 9P1baaafHNGTg58P999II28191bJT1zLNWWaaWQ0C8Lr2gkUXKLf0P91BIGI28W4b8891HMI + MY0b4iWQ24Xa48HoGgG02Y6u039990BII4bab8091H2aa12BA122G2abWa01DPH02GWaW44D + 9192IQ2A9995IIIswg1e9P93ib0191954S02IIomNFe6W3o98XmNpW01GGf2Aa9X3r2YmQrC + 45c2f0S0820WAa61200GIIoKs41b4mW0G0We88O13204W04LH2X0HGOOB08W0u24MIi@XHxI + v3@36s814190H2GmY0AK301n9emsW4CTy2G048I9b0G020l0nG2BEKY89XMdHOJ9C0G1v4Om + B8EC5_1R3eG3M6y2G1jeI0801WlkFeo07wasgn6m8U0EMUebGhL9WAH_28YOMEOD2322WXqs + M883BICOY22e8tZ2C9A9HI1IYaaba9BHf4I809P19I2a589D9DFh08f09GIIKnaKW4893oII + 0a4a48P19HIII0eam499DWYg98V@20III2aaWi6w4GJGIM5Y1GIIIInFY4H_e6W209A9L3G1 + GIoIg1W0GIIMaaa4tcc09910G2I0_uk04Waa81A9HI2I0a08HMoIo215aJ01IIKIWaacyqB1 + i4a4Qhk2aaWaLN7HD060aaaCqQHALGYOHAuseAIkYXu0E0GG0qn34m0008DW8wTWW3k89r1A + CXD31RRBpynh4jabCRPQ30assyj91HBuVttsbh34eFoNsqYBaWDlVRun_W0qlyDnos20wQoi + P0vr4stYjH8GHBzhssWS8CDjOVRnDss4Zijj10WWWijjTJ00Y4sssq11006QRpMI0002iDRF + 30jLZ0WjjDR000jLJ011000sssXMl1G30100WlGWX00CdD00W0Y4GGAGM014I9020W50Is0Y + GK025QB0A381W3Wf858W8W0WYvesW4GI080G2b0PAKWO1HI0888G0I5100C081f044ajffna + K48msY21J2W1GRP6289IKajPB3ae9BiT3w24BRRtMj24RRRr8995Qz62281DJ9I28h5HD80f + 3H4GCG6W29130W8H00K0Yei4bGc44F0c3G00O42W83004H044CZWWKDW8c8862WeeGY008oY + 00a22Y9O82WC8C1010ieRBBI99B1WjrC8cai0HssiEIIYa0Rpc689IGOPssM9jLNW5QIIaOR + RJ5KWsss8GII2XMh1G0IOtassG091GQJRpK00a5TfDP3G000HM49r0000rgbD1H6G0Ws2a40 + 000OHRG400W0eeiH3qW28AbDRA2000GWCj90119PoMs401011RIJ28000KIIICS71IIJH00W + WW9f9T1A2C99CKTj1DIGWcaa40000LnJGer4KUH1XMV1YJ830Q00aja811800YcsIeY402WF + Vbabeeq0sWt@008W4YvEx80qI2mBv@0A0B1gu7h151488NabX8GW1zUssWMW049OUI01W027 + Efi80989q@fx19f9Jq@vN3a44Ao@FF3I2a0u@v@38HoG_t@@3TRr5uHGIgjQ2GIII2k@@t39 + 9PerRW1DfHf9DjH2WI8bcquR2R46oxpsgXLQPfDRRa4P900IIw91C1125jDX7t40aoaMHZB3 + 2MJIaIP3HqIJZq094OJ8DIRpaab1q8DjH1K60Yqsc00004rsss41005GRRZc0W00ijDRY200 + 5qsiD50Qhs0100WIRRRQhsWu48ejQ32jsa@ZN89DL6lFaKcxPLc2U8HXjHAOeW4k7vWg1C8d + c3os6jweKu0q2QGXXFrC8M16YK1Y7@WAgl7W4a0iYW1H3mG2158CC0e6t4004aK1Q1818000 + GYKnA1020001WG00010a00oFhCCkm15BOG0WE4mjB1VM0910G000GVDSmbr400000e80mY3C + G000O4B3w00Xd0Auwq3MacWv6LuZPMw1TaKLBOUJ2kiaWMCMu1fCMIuWI7SW800GWJFbJA1h + QV0210mY5w8aB201000220O008kRuWoz8u91Bc5eX8GKuKqFQs6Yu4O8dwK_KbgM2E0O00mi + 180301e402AIiW82H0GG0ma49q@N1JiTmd49C5W1xEYGm990100w5X7YW0YZ21H00Wm1w6q5 + W1v4a0108mS2K0500GH06aJW1bCsGE19KD01jLlGX1BquO117UGCpL4Qz7e000Q4mWe0I8PP + HABLYq0QujZ6IZMZm9k8Tp2M6mW6V9Oqx50908j6G28040Q2mWAXAeM13Af0XcBKe8_5U6GY + k0COAB4sAmXbH_0108mJA9qDW18WW0ZrmXv1AOwW4Y9@W7C0vObH2Qm38GI0LBu0610WM18G + 00GGK@4KZW20I00cCmWm0C8_44MVlWe1OuYaAwHeZm9q0914G607qX01FTHmt36C1G1lTQn@ + 064jX2p1GGM14KGm31SAnE9J4Qz68840kF7Xw8D0208W00002004F0GGm07SXR2xIgG7Y44@ + g1911H3GSKdqA0300_pc0O800tHSWG41WbZRG440GnmIC001A08We00100G18H02cVOXBQPO + YeW002KCqX1h1n01W0WDECee664W08aJ020CW0MQm00A80ZI8n16bqiG8zKQ0W0008808d2K + G804G010u0t5e04001400G40GcvC0180u7s2M0WWq4Eei3A_Eu03000FUW3202WS2OefS3gO + I1G002r3KGqwIS4W1HTmmBZMy306TZgmE0JG204u8W440004S06v2GmXJ64R960H00Moldn9 + kGW0ImtwkCXm3d4S0900Ww6sP5XCg1WXTDOeG24I9XX57Rub02QTYW22IO1e7o1Der7SOR24 + wtmXeRduJ09cDJcGF89MPA2xLXVOEOqY90400SlM1TiaGQ094LG3HBKG86KCTH2DjenlH7W0 + 00w4038000Uy05FRImu1HaGJ4B1amD6i4bx520G0g10YQ2EG00WmVT4CFG47AGmy06CJm1G1 + 00AznZgTG862B2j63D1R9GII4AQj0ab448G99GIKG2W8W419IWaai4989C2IG4aai4OP8D1I + IoYW4a438B12Wib4OB93IHGYb4a499vDII0KaaWWP19B1IIMejQ2aWaW4aQ1fiI0aaa41B9P + 9nMGRr504aaCLr509991III8qwDa0ia099GGIIIWWWa89919KII24baa8389HYaaK1r5819P + GG2I0bba4W0990IG2iaqa80oM0aa049191MIGI4aWb8190H2I2cb4i409DWMNb011B9oI2Ia + W09LmMHE174_Q6DDGGGT4iqG17HiGD75Cr73xTq0402Wk0E8vc2ITmYn9S8qQPEc8Xa98ecB + 3W040S4L22G02QkoWz0I8Z23QHoWF09OId729eWhVC9Ix6MjB34002NiRmEZ40Y10OGb9MF1 + Y_G8unZ20I00KFO2n_v4204WcgNePx7kGvZjEF8_1Cwcyey0yufQKMRAc22212100084W10Y + 9wA5AlQXU2EuKdPo9W2caaa5UW098B9oIYIaWam0f9P0IIICVV30IMws_H1444a0991HMIGA + h42au4a8990HIoQm8q601999dw60Q2GM5I31dSGY8Hq4G19Yi1GII2aaaaG8991GIIWiac51 + A9DI2IwQ08GWbaKQ040WiajJW3Wcaa80H9HIIGW089H2IIIa4aaQBmWiIIW4a4G117Kio1aW + 4aQBu00a091dOHerY0130eL222ZWXHCOOes60808qVc1DF8ncO5KPo27lpIg3KO33IIstsc9 + jj4VVRRMpua0CjiPRpOoqyocjzwR56KoajjfHO21psss01811UVRRoac65KJ0gejD9RRRcCU + c4iiiP3OGnMyscjb10QAuxssc500GPpssc100S4RRR12m06ejjj90G02usscF03GRr5W100c + djj1G00WQ08W000ewsscGhr0Wf80044K840MGIG0018GI20BLA8400YEG00380JJCG99085X + 5Y6Wa0G6mKGG2G4020n000G31J2Wq8002X1JA072902C5eGWqW0IIWm0I2I0mMsY0III0ORR + 3O9DH4aDD3Xa099s6iXHIaa4sejjH2aa4hmss8oII2QORR1199HiijLZiaKerR84W8na4990 + a44q02204O0W2OGY4401IefCG9W0woI0G3o001PF298114LWCoYs4HQIxCO2BrGYI2WIHG22 + DC22CH03JZ8890DbWGW9a40K64Wejj1Haaq0pssqGII24Q3poW9823iLRHWa89WjORRb099X + 6kjjWWaa4MsssGUII4xQRp8199qwD00G0u6aca2004MGRJs24aWfjTHQ080WescjXI204e7D + 990I002brqq00100zHQY04000Df9QG004Gj9HV02IW2qa9f91020Pcak0088C1BQQ0000XQI + JIW0008C99H30004sa5910800GIdK00XMR04000X999xyI09990200GKaa42jM3qdoc0i4a0 + VQR2o20I0fi43408I0sqen20003IgjU14899BwsM1aWW0UER@XWIG2eelN3819G8DDQ3092O + CMe5XW091CsNsY0a64O@HP06KGHG@@F2G2IYq@zF58992q@yk6Wa89y@v@dI2aeyJRr6u_@V + 4399XF@@VaaaaWl@@zGKI6Qz6OII8LIwRJCaCKWDDDdsm45patijQBLYKMoc4JI00KgasUC2 + 310wxRRiCe109DfLG02WWqc4fG60ifas8D0G046IZcc85G9WDQINWajWWi9jjW14WHfjj910 + 000rssCP1202JRpc80003jTRr9G000KJRR3W000ifjjFRHWfjjbGhJPKnJw1na4RQ8F9DAns + aG8B8YP460OZHJB8LdIEsXdoDBOVe3ogy08140n2Kns16SUG2z0yG8G8iHW4@4up6154jG7L + 4bGJ09qmj204000180qQ01D1KGibjq9D80100IQW0400WW002E1jWO0I0W40mpX44@W3z0SW + 840Y@9K8E02EfG2G000pKqGZJr0B20eW05k1bW6i88TW2IfuXoW985030I024pr1d8fIE1Sa + gQ6r0O0820eb8Wu313Y3u202W0B2qGd3IiqrAfA4o02HK6W499anoxNzAm201W0AjW01a04J + Sf0092W7Boes12_Vm0W00GT9CHt87CNW4HVTY08GWy0I0804m3048e4WueW2gkuWAlk8dWAK + 008KXo5XPqGE1D4Kd62200obYWtBQufz32rZXjuEe7692AleJ8m0XW0GIAMi6j13rGH22502 + 000100GS270D008EX3gXccP0mG0W0n_MHqMN128G0kqTXE1Yu@F2Yhd04001vhOGaaZaJWB@ + KMGm9841W1G0W0d70Xq6IuDz2cN9XnV89@O3k2mW0O09WJD2de020G04000EtTX6LL80b3AP + C2W10WB5SG7s8KtWDPOenbi5a9F101100440CGm1W004FnWWE0Auq1B800eKQZ1W020MMWWK + 598Q14QSfWoJ2wb45I9uWPe88bT9kNO2I0CaNAO0G04aY7gON37wyOcjGCuSW3sSiYP0Qe8W + 508GGsFH2b9Smh4S0800AntQG2010G0Gg2t366m05801REOGu0902108HX3Y4W08000ZENmP + 86W4000100Hne4CeG2JG8H9044zmC8800p9eW0WU8dW6U8sXg480220GfC7aJ037EbnJDT41 + k5t1Kot0EW8W2OEi8s5WWgF8exdiMXWXi2YuwRDAIaW3aB8YhEYJGcQ0EOe74A6u00101hhv + 1G000030051eGVZ44sH1za2LVw4yQW15YamI2BKaJ6X6K0010m18mugWEUaRafK8OX14MOvW + jjLOe044000sl523KVmW17C502G0G00400yDG1jPQmq9Ka215VDOG_8Q8802u6160100qCF1 + N4Gm024G000wP076ojWgo8OD9380G0KSI1G000VboXgRGOVDJITW201X053Kmx04KOs1H1eG + e1E040Wu5W44001cS53F0KmQi6qch6Xw43IG2Giaq5G9991GMI2iCi09A89I2WIW4ba89H2W + aaa89910II2Wa4a4999DDeIm404Wa48H8MKYa0049A31I22Iaaqq09f9LKcIcabW0CGIIWia + a8989Hs2Ioaaa40919IIIGabaaI3W089P9r0KGgg4a0B1aWaWILDXGhl0989eIIJIeaaW880 + 9p9e03II0eaai8889YWaaK199PHh48D99feL20991HII2Yqaa0IImQa4aW09HPHGIG0aaa01 + 8998YY40bW0001Ia4aaa601WjWa8189rwg1Wbaa8199qZz1v4Gmmi4qKR4XlUHf24ajF1nIe + G@25KDV3jQ0HzYHG000G040GIIG100WjP23ci8Xe08OZ036cuWH08eLeA010848T1W00Wkfm + XF0M0C00mj_BKHH1nrToFZ6W810egF2o0WWrIE86X7csuXY1A0aa0G90EKYs230OW800W@CH + 9gZAUjyWw6Gejc364mWx8L8dWAO200CIZ7neKGeE2rS5130mm054C0m85gdGLWe4gZC8KW0_ + 20a@UaubY2Y9WX6Ywef03I5GXn1U8uaAAyW1989F5UG08P9BIIoY3VGGY85KNB1IIQIQ@O18 + B99I22Gea448998GJoIID04OIIGY4W40IIGIWaaa0P999GIIM5o12JmIaWaa81IGeJW24aa5 + 4So1fHFIR_60bW4W1998oIGGieeaO988nIM26sF14abac9WW_@T81R2aiabKG0104Wa8998b + J01C981G2IIoi689SW20o2IMi23HiGGerAaJ01IIII0aaa4QT98082olgWG5OWW00m06GK@1 + 2FEe0208Xm6GecL3QcGb7HW8r1AWfnXZRRPJq2ccijjDRLRJK4ssjzjDPPARpssh9w6iRsIU + q6f6X9xBRe4445ij@b9GTA6_M_i1pQb2togj9MGW1Bfso849C5iURRPa224wljlHAWeYiijC + J0WW0_soa11802wRptY7090aDVV30jLR0200Osss6jLRmRl64Qz6C045WaWLG1I0a020240I + 2GG18GI11G14a8010H2OXW8JP04W40CWe00mmKWJ2I48H184eG02O0Ia60AG0eaG93i79AG4 + X8aO00aG0sI40G00Go626oImWGPBB699BM0ifP8Y4851q2fD4Y0WmsDeBGifjzJq4ebjj5aa + a4nssMDIIIXMl1aa4436640IOIK3OHGG08028W02H46180Y0W1288X18190W6a18WGm6HN02 + GJAG0H10AW8W01WD92281O8ml80nW8D8IWW4n3qW21m0008G03Etox4GIJ00RU32C99I4j8A + ZYa0DAsWWHGI44sajjLYaa4Qoss2IIII_8W0JIIiV4OGerR00b6LRJh000aKjfFf0B20qc4s + 20980KJQgM88106IIsG0400Wj9RR2Y00m7f050000Ioqo4OI0I8qci409800QRQc0004WDeP + Q00Y2YG69CG2WaeM9f900G00macc00000BI2Qcp4OIGG8qw32hsWGhF0000Kv564Qz5kjj8H + 1080qssW42K09QGTsBGo08ia1RE812071P_H9I06KnlD10G00mJy@3W4jGmRpg0424a4aR2c + 2Gaaea9R7102GqElf50B01uiIy4CXaXGwFB60a44v@hVE7IGW8@lTFG9n28ypREW4BBvtsgH + mZaa49_z@GhBm@@@WaaaaGhrG89HfQQIRXaX4GiPjLtcWgCqcdDLH8qoRQscQIWI4QrcqW9O + 9RGQJI25W9C8lfT2Mqs8asaAb4008rccf128m6GIsic41BO8PJR2a5fDafjD58040gfDf9KW + 0Amqc6DP0YGOQRs48W228jHRB0rMz2XMZ0000eghL8qwAY2sW50A0G22mk75Cwn4jQbH6khC + 0WC0C00g6fYqaKOiM9IdXWdJK8hp2YozA0080TfO1W4GWO4IuiW4000Wie03G000G0004Q71 + hhbmD1C90028FX5cag00I00G800_NJXiZIW020GH29a411T6lJ4tc08028J0301000900ioK + 2cRe0G0I0n4im8XBW000Y2000004X8AQ0500mpJFaA01R@jJx054gJ1b0lGwS40a0004W4Gv + s4Srm1dXoW00010040XQRmXd6aY81RDlJ8YSC003fVIGt1CiJm160002bm1G208HexI8YtaJ + 043tYGrdP45029kVKJ7P0110uPG2AHe0180GXcaGNq80210W000W2W00W0002020000IUMG1 + 4WGGg4f0W04WBIdGi36qqc2LwYm00t0K0Ge8j2o9G21I10f8WG0T4a2G1v4SmL04aJ01blPG + _04aJm1F0K0010WCACeb036ShW4Vh1010G6vb4NI3bjS0e00WCoZQ005C001LDf25DKG31A8 + 0108fW4QFe1I600NdKGgDC4Wy2XMV4822WEJGOq240K40iJG1I880g1G10210jNi0830G008 + 8v4KGi0Aaf98r0Cp6E6SFG1BMlGJ7D4IG1bWrmqrCiwF4fT0n46ba8o5LKGmtJ4i_A10440M + 7410I00FDiGNH6KAG4010msQX0W000xdHG6694YG5PDI3600WinB8@04g2qW408era4oLeWS + 18ee04gsnWoQROCe3INhWq1K0200mW8vWW00O9t30488anG1G800hO01W080LEeGISBaIG1F + nU0WY0WfR8m40Gme86Kth5BFqmKHeWY080020Ghb8SsO2048060G1X000p2umE08a1G1D9G0 + G0GY7XuuccHc1e28008N3SG7l604G0fLz302GW1200yY0402008804u58360W0q000RDa009 + OWukBW0W0mo06ibP20540I@nbS2aOKW4cnNXQHM8d04Mpj1G000v4W020aW2QF8d06QBmWg3 + C8d0HA2GZ_AE0O02mn05G00WetX22nmWB08eE@267818W04RXa0016Wb3EujU5My8XVEIO5V + H60O20J0G2004QBGYw3EuEK3wBv1020020000100y6G19T7oGHSqAG2XwWHD07a8W2ToNmz2 + ZyTM1h5iG24Cy9W2BFLIE1KCIW22000g8fYL0QuZ33MamWx1K0802Gg4Vawm29DBoR0H0980 + OpE20822acY17qZ0010eYB8uE43_sfW82AOt32AGxWYLCOx94K00WCZq1JEhm11dKgm5x8O0 + G00eE0GeRg24000LB@1C000l4mXmEG8UX3U0e0mW00nrrme3fqkm5LMH00GeWIHKODH2k6m0 + 0c007CeGYv4SL01vXZGGD7qRU1LWVm5070802g31B2r964a40A889X7M2Y1aX4P92YI4YIa4 + abXMN004SIb4aa0C99GGMIYb4D48899I2Go9e9G65b58931JAGWaKW28981HGdGY400C93P9 + I2s0BfMGqq5qjA1ia0a8911HIYIYbiWGRr6K3m15jU0B99fGhzGI0IW4a4DO893GO2Ya8CbG + 980GGM2Yi4a082YoaaWW0981HI2IWaa4CB1190II0Waa48999ueeaK8888GQ6I0a4a89e9m6 + IQ000dK831902W099P8IIIGB8u0MI2I4Wmm67W0WW09XlYGE1EGGII8yLEktW04008VSmmm2 + 5W100eU86AuoXW6IW000or38qO42PJWHIIoyBa2@0GGW0AKcI4dsWm4140G40OUW60900aO0 + 2tSSHlVq08110400Ouz502008U02Qnf00004LlVmXEA0H008h622zd14WI0D1OW028Wa6z9E + 1AGaW0ymG497OGE16CMM3j2mnh_CqOoCD05JG344qu2h0SmT15CLTA54m3108WmPy8p65G00 + 0DAm4X_bmt@8080GuXBPA8W2cWa40999WIIKZW044P99fM4I244ia89A9HI2iy_C1a0ia891 + 3H2IME0Q20IGMKII1O9H8K2MI2iai42998IoIoqR90G2I2b4aC8GI2XWG0G3IYj@9GMII20a + a41919f1GmT86a8Y3fH32GQI0bWaaG90B1GIIYiaaK3A91I2M2qab08fKKw2W0o6M0HxNWXX + WaE180XWa49890iaiaW91f1MIMYXda49O8Pq060ab4098GoY05KG01MIIIabaa09P8H0IIYa + 4abGhL8dW209D85Qz9LxVmDN9KJN2W0008020SAY3I424EaKXA6Eur130801Cq76Z00nPd6a + w084dc8WbjjO8P63ssUcl8DDJJVRstWKXybjfRvcNl9bb9RROLb8mabjCOUI1ZU@scCj592V + VRt41iQ7RRrMK4eiXjLRROXqqWMjjz8IGQ3rsss02GMHssNdX1OQ2Rx9oW0Cm1jjuPH34a0s + c_l1O000sXMl04ejDRB0104ms2jc3KWWI042oaR38G88u00988IWW08eYGa02Gi050181O4f + 001K0I04Mp2IK0R0G1e18H4HY0W0C4b1I0W00Pqqe0G0YW4GXW02C1II8I10Y00108OJ03D9 + GGCiX0YW4DA4sm44RY4X0QnW60n2IOZsM69IIIi2RRZ8991ebjj4aaa0nsscGhzGI00ZNGOJ + I8W9W1W80f0a884W008IEa6R300O24acOW0c0HKwF0AQJ200PB40C800G78GGY01Wd49XcWY + 0I40a0I426m1GW0u2310989a99X0FR8OA91X0bDk21cW49wM7aHII069x4me8182RnssA1II + 2DPR31f999ijjrXaa4AsssQUR22jM340W4Ejfff2220aaodi8002IOQ44WWe8gf9Rh0309gL + RIB000aGDjfDO400Wmmc88H80GGJ350812KJJcK0We10BHIR8020m4ff58008Gaas6G00Ges + 4KSWG2q4sc01801QI3Z00441Df0XMR0f10XmgBuoA2C9910002AqwECRJ932GG0abdjBfH04 + KtbKrC4CBOOP4UG010O2rA500a0eIPl102G08cVj5PO09GXKEDiWWAnMpaDWmW9OVHmEIYa0 + 8DJRFCIHWGOjD989X0nyVRC08BAoyF7S4a10HvdxQ2IWXGvddT09qMol_@R8HI2ox_@Tijw2 + SF98HIutt@EaKerS0af94Dj99WW6IDskqE3Q8W0RRpsgWG9O9DQJb4T089mQwHKb08AB9fXK + K20qmqMJoHG0M3QrI301mUQZc009Q9iDRwo4eXDsuDDH2mI2Yt_c2GWm2rssa48G84OQJY60 + 0G9yj9J220f1asef50004rgjj50204ecsscGh9mss4GerYiLb1rUXnzN7SXBHPnGpA95KF61 + JLcGrmBCJ02LlzW000WhRaeg68ALZbpS9vHd5040WiCW2554n509adJAH49310800280L3GG + t0604W0wkf2s8W01118bbQGk09040eL100WW0001800p4i0220010WWJ1O0W91WhPAeZj2Ak + yWl7iPN03Qpk0B010j3G010YW5J9uXY2k5eWmBHu1W2W0I2Ck610W40RnyW3E9Ol0304054h + B4L2GGT2Iyns130S2J80042G273Omy5CaWL1t8YGP14080GQoI2000aStL402802emXHA8eW + 05g0WWM7K0400KWJZaGP3G02WUEu1W022@3KmvF7GG008bp2UCGXDWGe4W2YBmW52IOfP6A4 + mWi88OXq4W0a0aSf89XqGJ0EaGc4R1KmDPJ0800eEs3A7990A04@7KG_y8q4i3nCG0010XcM + PutV56GWWVryeNDAANZ524X0NBGGE1Kql11PSNGR9HCGB1v44Ha@64HG6r0SGE1Jq2c6r0aG + Es5KKW132OW280W10kuym3W002Ccm2@XjmT3Kq5f7tFaH93Fa7P1zzQmxA7KU12aW00000Gs + 0U1Zlk002GWW0E0880mt0Gy7k1ji4q3j7G0008Vb2smBYK2Au2W8sYHYj4EuWQ8gks6400Wv + 4OGs15iv62l7hGA04CDG2j7Umk79820083W3255XHTi8rXP0IW01021uJ05oWnWCwAG00Gml + 0B8a008Q06w@X1W200TVlJ66O0GG01284GU1BW0K08Md30208SxD3NIOmN34G000040mGc25 + 0C000000Hzn5WW0muWFDg1OXT6EeAeJW00001800W0G0W02Wu48el22kXMXp8TOE926GuXny + 9OuH3M7uWm10ffPM0414KaW13Ch0GB0Wq4K0W08md07SkQ1nOQmm0DabB11Ra1804WI6pfX0 + 3c7oWe7E0040W141W7GZ0W000Y10WzSDW020u3n8aJ11zOM0100W@RQut64MXlY_hM9dW22A + m00220Xt6Hr08yAW1v4GmHoF0G008302_xgaS2c8EXBc1jW9JPGW000000mrUVO586sBWWK0 + CWW000OW0WC0A01G2GE1CKwUELOq0406040GGz5umh35KIm3T7qmqE6aRXCXJq2I00WOKFuS + X6oQuWROUWK00mt7TKY_8vTW3G33WH6G0L000000e_8MuWD6sp1XI5Ceta24300yn227eSmq + Q25@F3n2Gmi18iBG11RiGi1708W200004490Yb0Gusg30200zzZ1lxYGW07K3_2V_tGW2EK6 + p55MOGXr4Sfp1G000p2e1I000V0W01a0WvnLWG00mZ7G4ua4lOeIg3K0808K440mcF54pq1T + 0GmqK74DW6r0OG@1BKT61bwTmI8Jq9m2BZmmQ184gp529BBK6II2X40409B9oM22bhaa090P + nIU22W49H0IMYaa489591IJI2aaWa1999HmW0YWaa6B86Gakaa8f89J60IW4aa4f919IIIGC + b4a8Pf8aJT1a5aa8B19b0R1GIIM4aiaKdQ1IGoIaaaW8899uGL2g1WWKLN8qwB4IMM2a446A + 98923IIajW4AJ89920YWbya0X80Iii50iaWCMM2a4aa19891meJW4WW490404a440D89J62I + 244a41819IIIGibac8019WaaWirr28B19TGR1r0G0P999IGI2XMJHuhbKTH2ljKHz24iWq23 + OGG964aw03rNOm705aaqIzndG49H4EG18004EZ81W00WHsym_AC4a83HKemZDfSRp5HlPml0 + 4iNm1bqSGg06G2G0O5l560m0H200j4eGnV7qw74L9CnI1S4rX5R7OmNZ6yge1tuVGE1Q0J02 + OMc6o52Zc0IuXRUG001CNG44000ZkFXLPsW40WGZsuaMZ9r0CHMKIiVm2H8mm6JXqdq1n_vH + E1KW44d0f999qoII4a4a8R99HY2It_11mIIIa891r_H12I22Q@O1baaW891IW4aa8991H2I0 + Waa64RA1AGII20aa4899f9H44QCv0I22ILXSGl84GGIIAH45Y9XW4H219930IIGGe15408D9 + Hs2204a449197IYG2WW89II2IWaa04DW24aaW0O99b601j5OWaa009999sMIMY6mWGU9en4G + 2EX6600030GX830WXyzOtX4gfWXu_g9r1Aei8b9RRRpGqO6ejzCV1OJsWssijb8JvARJto59 + YY8R_wwKW93bPxBRWoL35jbd7HQSI4sM_iHJOf0ssgy9S0HARfts068fFjQxBP5UM0glijX0 + W4Xijl5Z1mO0osoyX0GO2QRn_24093kDVB3W2uZiDRf3W0W7cjjd1W0G4qwsV401O1ORRv60 + 08qQCGJHA29881c8b0Xa41fK2W0402a0Q30280m06OYKG2436KWA08Y00G104mi0WCiiX4Y4 + 11uG20Wc4DJG2X01Hc40AG8W9JG0W80GXWXf4W4100iDWCWa0CHs6YCMIKWGRB3K89J2YeD2 + O441HXDO3OaG9InAi58YWaCWMs6IGMIW4RQ3q81922RRBqQCa05Wu0YK04I82QH00WA89I29 + 01PcW2fLY408208eEK5X18aYi4W2c4GVha33G1W01382DC0If99HK590AXq111KaaD0G104A + a600W2G3018GGs6pcQIOJmQh7K09f02iTXOWa441o6aEGIWkm6kbeIWa0GJs6JGQI12xQ3O8 + 194YDiLOaiaWXjjDqQCG2G0xbqa620C0IR6RYI0008jDHR082YiaciFIY0Wi41d582200aMs + cW9H01JQQe1I0009j1I10aaGh9H30HGW0scC998GH0JaKqX00X4HHJQ1800WQIGRW0W00C9D + 120G00aaERA24maWg10200bm4j001G2GIam4W00189I0300W44995XGhrmaDi18981osEsc0 + a1GHQJp431Y2WDdJf91412aKrC8nZWIGnxB4120XGgsJWK4C0JQUiG2mY0REXyGGYW5fUQH0 + 04I2MDueW89A0ntYieeW40T@z_0ai08v@Sx1I2Y5j@Ct991o2@@kp9aO18@p@vXK81AlvVZH + aaC4_z@yHYIs0_vFY399XI_@@Ghn0GAI1QJxQZ58bIejfP7MIW4sss95GXIWIRqcQI4M4Qak + a21H91KJJQZ00C1eD1DYWo5Widqg1G0W8bsc919OYWSIaac9GQACPJRYaX9Waf9j540X48jD + B940W8WscaD20Y4ORJc65021ejPJA010PgLQJA04W1GDjPD04WMmcsc8020g6022jcZkMEe5 + 434008i_14Jpzovn5axZ8tChojV74dw30400AVrWteP83e2QEkW62MOqdCEjkev1AeI02wNs + Wj48GG002400ahWR8lk640044Ca7R6OGV2z840K8nX40402KW03ZlHm5SFyB9338nH6CXa51 + ArGR0900WY4KOAK3A6m0110004000a0054G2W404002200IGeF038900KNr5HHqmvsp4yQ10 + 480830000000500qPT8aJ01rSImMY60A108_L3G00W0M0Gene2o9u0o200B4mG60C4IW1tmP + nq14qkm11ELoF4BS1017ojGP0ICRj180W0sHuXZcI0G00mXMB4x37XlMHG4BK8W1D1OmOO5C + I04jYPm4vH040aOU2DoIWXK7cPtu2o60XG2COBj480I020I0e702YzD1W02G00G6QAW0420G + L5KGi14W40004G0G2190m04uh05Km00yWG2ZO23180Ws5I8BX3U0eWq188dWBG400aJG34X4 + 00050qUo2v4mG606SEQ1v4KHerQad732000d8eWv6IuDiCU0m090005jKGtApCyW3PRhHLD7 + CwG1tBKmZ26KT01BImmGB9a601j5Gmc14iGx181m0YN8YO@Mf60CkEu0W0001QR0180m5@8e + yl3W0G0iS04bzJ0800e63AG0m2m004SU91vJUHK05qhm3h7uGdqb88G1i917UVjWk3DuBV26 + ReXZAG0800mT16G000OAn32SWYzdP8H4J6wt040WG00WJo5D160GGd4WmjgACUF2D2KW4000 + G80Oz0OW004Wyc90m00Gm2Bi4q1x8iGk07aXnARXGGgV60G0O10W4Om17Ca01400egHGXoTK + 0G0820020G2004043oUK1W800G9W0ILdXSWX8iu9chdX10e0K06a00049110000IWa00y9G1 + 8108g1WWI1Q8TW20940qDG2r0Km4F64WW2z0amt15SGq4h9rIL55eaqWeI02o9eW@5D01000 + W0004008fEamF348I000848mHi4aP_120000804a2Y2ZraGy4IyxW1v4Wn35L0100GKW2OkG + 6i4W1BDMGb05yL_1rwPGG27q4W1000HN0W0O080011004a4Sp919sQGUaEi6W1tyTGbJLS05 + 7G0W044W4qEW1dG01G00X7IY8d048804aGr1W088p9OXlUeO4O8o9OYu4gOR3202W4080208 + 108410Wvm8u9N2020Wq@46RxW0W0202002m0G0Q6uWwRM8GzYsjm04G02HuNGCC580a0uG32 + cn1XY8AeK34Y0WWcT8O11Ak0kW8Gn9KdFY7uW@KAW0Y0GuL6q3G1V841104WAMA8EW26rSYo + 5UeWp7_4WXO0G8ZsBYrW2024078GGfqF4M32b3a0100WkQ9uYW30101iiG2VWKHcPpyoY156 + G0H000W02000206rXWI2EOIz3W01WaKW22100UAWWDlA8le2EoW010W4bnOGB2D06008uW5_ + H01H000BFHGeEU0901G00442m4WQ5G08010Y02WwUIOe93U1eWL0IeKY2UbmXtA802W0GVEA + aqW3JWGmO04y3_2X4yGu4Oqd22leTG68AyXH1Hbimol4K1W1z8qGuHS0800uN24g1GYp8G8K + dBmoIMg0Wb4IB9X0II0abWqGJ99G2GoY4D1009I6Dae49D98WG12a0bq09381IIGY0b4C180 + 9G80i0P991I006W0441890I002aWbW8Pg9GI6209B9PRr48198OAL20998H2I2W4ia498914 + aaWr0GWaaiWKLT0H1GIerPWb5i410C4q42I50a10B98maIIY0W451J91IAaCI8110GI0WX04 + e199HI6I2a4a41B1OI21IWG1P1IGQ04WWC9188GOIG4c44e481HWMIY40W0IMIIa4aajkYGE + 15888PHIGIGuh9Gm2IA8022VLXS288yrC040800229hX3gWf0G020H_Nm88I4a91DCOmH04y + 4G1WWW0UwhZO0KOue423J5C00A7hnmuX5G820eL_4UYOX02UGI00mzCDaSX13uK010WWu0Ee + x02c7OXa08uHZ5canZbL80W401GG0WsXAepl2I3814300N3K0420aq280WW0rH79e00WSRW3 + 48W00H01000G0G1002000v6RHcES4rH6tnL00W0a_0F8AW6I1WWARE8dW3040GSAG2v4WGEv + 4Kg02@xTGJJdCfA1XE62202YqGI8xb2MNG1010W9XKHg16KK23D8eGzJ54QzJ310n0tDa1G1 + Z8SGL24iVH5bfbHN08yEO4t3SnnL58HP90G2WYaaa0119O5UK022MI5a1a09HIarWa8191HI + GIWaca48R99GIII4bai899XH2aab091920IIcaWa0909bJj1aWWXC819i401III0iaa4y421 + jyZW4aaakyJWW4a4999XEg98Ha2w59XGhh0moG2aW4bJ68Wai1098H90IIm48ai089X24Ca0 + v99902GYy18GYMI2aaa0H88BII0I409PHoQJQZN2GOII690102I24aaaO9989ha30o22sMD2 + Waa02jsZS2u8YX2a0104u31zkVGU37a201THLGBM6C0022404oT0X@rIe_T3080CScK4XVSG + wKYaw05a64sWjjjPG0DKssMcy88C2JRRssM009djvxhs49vaDRRPQc8moijiDGJ0GZsssdWf + i92RxRsiDjA0RRrsW20jWjNRR8f2saMjjjioAI0ross08m2Gtsoc9aT40@RPseq4C0ijRRv6 + Y40Iclj140uGMizi100I0psss080A4wRhR24048ijjP3004QD68fX0W40003sIYIOWW5IHJG + 008A3fi824005S0H201488A48a414WX44aM60HGJ2OGN24080H02GG20010Cb9I3W48Xq2j0 + 000a4G4q021NG2GI2m6IQ4Y0V2R680AI09WHBJq891G0XDa2WamIj55oaaXOrs46HI2IGJR1 + B88P8WXjX24a48Xjj5QD6I22PS2I6028D5C9180ba49Wq4e5JHW08GIE79Yqs5eaq08GMU08 + IQ008x3W59D44aX4Xo00j4W08DIM080eY44BW4W81W2Z41BGae890W9890V7PJ8Cf90XW9B2 + 048P2haDIH1aW91m68fGJORsSM9I2GfPR1B899DXXjX54a45mwsYKIJIboss6QT60GYJaqqA + 001HLJQwB4a009D9j2G2G0baoWN2224babfb1102GJss4Y80eeHI22I01a4D991I00WgfTj5 + 9IHoWKq49X01GGQIs4K40W8fHQBW010YLRR20300G8f992G00ma6a88000GRBg40002KQImK + 000809HII0000W09b90002GbNOGerOe90X4D80hsoo2W440AAPRO2JA0iaFIDfHe0ab37399 + G0mordXW008IHtUGeaa50QJZ12IIIGoRR1G02W8ru409A8ImaoiW4a088Aps4IX40yfY@d00 + GauIwx7KIGI0fyz785B90vjUFG058v@@bF4aO8uxtL7IIRr4uNoI2Xmxl7V89IIo@XMd104c + Grsss4R08KORNZAW00vifDJEWG5jrs8Dn402Wrel95mGIWeqcq6Q00QGQRQ4e0088fbL2Cb9 + 9A99RBa448WqijD0ZK6GYcq60G0P9JQRBA8A1KRQIJC0510bDDR0540WcciD29b2GIpcM01W + 0MZsc6000AWQRRQ01W5WjjfL0006Wcs6D000XMx1G00WhrIeSe8g1mWLkEeZ6Mg31ZGRMfcc + 2sevWB88e5P8YCCYBVEeA22_70YqQIenFF60Gb028uRW28004yDG2W800o2hWsZE8d04kcZ0 + 4000Y000QBpYJe@OMFR00I0qC02P9y020GWYhC8zi4M6GX93A0G00ITmpSUUAF4KG616qtm2 + RAO00P0XUJ90819GFiCSxc12220QBwXwXBeaX42PRYKRMOUYGG010i4m1v4qGgeA0G2G0480 + GE16W0028dq480W0YWWXuM2301W04zm1zxqGE174601fYwGG6dSR81r0umA490110Oug3YYG + XbNDugS9kuIb08g8d0C0W00iG01hKRGNVE0G098EW2o9mWs1Nub05o90XZSfe6U460O70102 + W0G04400GG010022080GWAGc8wC3QFe00104P0G0100ag0C0204mWV6qVW2h4KHLvJybe2NO + S1W80nS28010Au8f5q7v4v44n@b4aJW21EPGE15yue1H3OHE1J4L62fHhn7T7yKd21JWm3j6 + i102rpIW100WYqPOA@3U2WXj5QOI03YK7XCpa9G02oLm020020G08IkQXFLi0I040W08WA@9 + eO55UWGYeLWe6042FmW23Oeb2D_PW090W0tatmK18i4w1vqy0i08W75Een32ccSXE1A8t04o + 90Zw1b8d0CY1eWI5AG000opW6SKI1V3QGR094aV2nBlm5070G80udM4IN0XZ3IO5p4E78Y0E + 7X002GyT6CaG151O0G00Wf6B0214mc0AKpH175Gm7274y71ZrRGgg5q701F2NGrE7SLo4zZ4 + HerXywN1pIW02000m148G1000300y1w1pvIGypIq33180000111m00q0101m@q64aK5NhVGU + rWqD16pfGGDs8CN330K00_NOX0b8ut03stuWQrBOkX5400WyB35B2OGk0ASveAv4K0I02Wz3 + 88wZ8IFFXzfG010040e00800Gp4VGH3Dy4019BiGbd4KLp7fuF2H00Wx0AO8_36JeWN1AW20 + 00000e0A880X2gy71W008GIK0MIe0X00WXwRmA14qU31t9q0W0WWG08OU04688XHVNX040GJ + 29KGz2VXYGG37iSB2dbM0a44W7HD8Q08o90YvfE9AWAo48XuwBeQ4CMrkWh5MONw2Y6uWq2C + eSY3M8oau4Cf423gNeWS1eeoI3QK9XqXGW0W0mF5AyBT10G30EmeXte0fd0823mYMt9OfZ3I + Go0W6000280gzQYdDU0OG0GPCEymX8fDgHc1OK_D25Hlmh1E020WuVW704014EG22042Y1eW + V1c0I00GP3Vyi6809O4dwl04W08ZrG0010YDVFuo72A78XemO000OGC04aZY1LNRGI8FykW1 + 0600691YG6I8HX2MuOXLsmG101GL2504108A02svj09800pgfGT24i901Zdam2G7iyh2G000 + G80XUkG2DaHGX36G100eK18oHXXK7wO2O2GWG0qB019gaGwy74QW2vgVGg098010OKW46Le0 + X1000W008200ilY3n94HA074gJ9uP9HT2GG2XCDK09OBpIM21e4489AFnI62WW01HIoMYac4 + 081P0IJGI4m050999n0g2IGg40aca4999901qWq79GIqI2a4W418JPII2GaG1AHI2IcaWiST + g5808D10IIIDq681Ioeww24aW4agg1GM2IsbkWkLB8qQCeWi68884Hc6MWK04C1BP8K22G4b + bi8309GYaa4H998I0IIaCWa8981HWIOIaW44P8982GI20998LG0O8aaj4191822o64Wa0890 + vp9W08KmIaCWYo9e01199I2IIWWaW8C89HIJIY489hKQ90819PE15aHR2LmcGuhLqlF1xnNG + 24CiV36rBaGun4K8L89NymCBQ4666041GQ6mXjoC8JW3o1W05008r2CHEDCaM715IqGk1A4J + 11rtamZrdyU032G02cf9X@GA000a80G0XKeD8TW50400LB04j3GGAu5Kd82VCcnJDV4d05Dc + GGW0IaG01v4eGJEVy303vXVmS280202uUeP2uqXs2A0G004G01WkKsuNWFw7mcWJwG000048 + 0WfvGOBW9I7WXp7E0002GXP445020Y004004iX8BZJ4HerL81B90IGYAaaa0989PIIMIAyW0 + moI6a0a0lYcWcdB02B99I2IIiWabvUGWbaa09mIY0baa80G9H22IY4ai49e19I2GGaaKa2W_ + 0199iXMRWiaqagGCuqQ2c4X09988Tvh0999eH1A8qQEWWb4889HHG0GW0aaC18B04GIIo9W0 + OIIY8W99HGII2aWW03899I02IiWaav4O0IIW593R92I0maWW49B98nII22aa0asg9W4Wa0II + IIjaaa0P99HGKIY4iain448B99yO01XM31B99fWJyOfX2wRhWl5C8PY3sQFXGwBOtX56BAXF + HMu3b9sJ5cK7e0qW2Kdq4W6cscjjj5I2HIqsssCiaiPPRRpE9R0QPhjs6c61hijQF3BCZmqw + cjbKIZOessw62RMPmsMtCF1918RRp6c0C5ejTPB2P4musijDJ201ocltDEKG28Mss60GP3GR + PDJKKW0mzjDRW201ajjQRW200mogjT0001JxRl4036VpsM0GerIm1008qQ2OI3B289f1k040 + YW040aWM010246QAJ4C0020G0Gc48aI1CG232W00A8DaX04C50H0aI1G0o0Wc0e00I9q02XW + 22902019094eGW1i9j904G409ibDmW45HGmWC66BW0PH0M8TWK2C51RW098XfFHJ0IY5DBRa + b88XMibDGWaa0Jsc68IIIcGhdWORRRer4888fn9859eaW0nqmma40Im4IImaC8G2W1604D91 + MID2G210010Y19eW4Wr001WK0QIE48QG02I20nQ02G0110I09JIIWYCSWe1X101a4W0a40aW + 1DX44W0npQi0IJZ4PF1sC99G2C8lRG08DX5PBRb09DbsibDWaac0MskMGQIH0JRBJ8C9G2RR + RerO044ao99Dzdh4ejjD500GeacqE1808moQQqe110eIBna0a408A9QO2I0a4aWCDXG0GAoq + aY2000GbaKqa8010OQJZc0W408j1R21G40ma8912000be8411200esca40800OJJPs5X03QJ + 2f1K0D18000GJac000008PII2W0004899bGhrmbbb88911ossci4000HRRJ6RO2WWbDBg912 + 32iyRICe4IoY0V5a913X2@AIaCXW4AIlX82Ie0QRdMGI352bFGp05GG0sjcja0u4Xo6mdCaa + a4mz@@W4bf8nLJw10GY4zLh@18852tr6@9i089lwl@W4919F_@@HWaWC_@VVG2II2__lt3B9 + 92_@@Ghn0221WQRJR2aiiGCDFHcq0A0ss6j523YcQJt_88q2WIbrs0PIHJGQRN20j0CyDfDY + 22WWacseX0m6Db_6D5HPqGGRqs6fO23iPQQY6910ajjj51Ce1gjjf9KG00WcqaD90e2GRUa6 + 5f008jPJB0101hDqQ201YfPJR0201m6jfDG200Icss62jcZWNEOEo2oCQ22880BuEn2CRq7o + 2pLlIk8R0O10O005w8WWlIu0100GW14aZ219wqGY09a@x1LgbngpCii67D3GGvG6qqh2X7aG + br50mW000G0Hd08CWS1@kf0I02W8w6PVOLU40YFZFea76styWm@CuQv3sPcWD3C0GGWmGC70 + 5008gi7IJe0400Wt2tGM05qO043JH2G00eO3I02W4Gbf5KJ427Ci0G00m2TD080008W44310 + 0l9Rms0M4sj3pJ8IH0KKQW1r0W010051800HCdmp4C04G00W08m90484G00GG2YW00W4098a + 04oGsWurz8r1P2Lb04006F5Oml060620O5v30041SkR1V_Wmr0EK8v7f1OG30602G2u715My + QXGh3PT06g8eWUqw8Wp2gkIeDCCvlY2080PTWH1FEKWW0GW93AOfW3WW09iJW3a000a480Se + F304040808iKX30100gKDZQ1G8dWFwXp006GIv4eW00GWS28eGD4o9eXMN9W410GE1I4jW3R + HdG13MaJG3XM7opAJ8G00At0A4000aYS3xIdGTZAKc05VjLnJ08agg5G0I2I6eWo9A0WA0O3 + 59Kc73n9O0800ma9QOMW2410WK9i3vLWmg284PI3J7mml_9K_N7DpWG0b9W0000G80m00AaJ + W1fIJGm09yK02pxTGQ2Kqh26HT0n0UTW0WGiDW3080ZarX2PeVml15a6j1j9S0820W10AO80 + 3M1m09008H3umJ3G800WObm9kaRX2HY0e2aGD060O82eD06owbWijJ08IIGdDB040WuO72M5 + 0X75804000600WW64P3IBomu2G0800AG0QPcWgD8uRP24081qDA1f9L0810Ya3902089204Y + e3M0200HJ26Kh42W00118804d49v4umKa9qMg5f5IW00SW@8B0208GBq4a@M1j1SGTy7amm3 + R0Tm805SZF1bvi14W0W75s8d0G6Wq001100Y00800Gqhp1nqIGoHIiIm2h0SGW044Sk2pgqn + 41R4EH50200KWW1C2W2C000R4W06900DWGmlF5a0W1NdSGer60240H00WmH05800024a4mX4 + B4bG1b2Oma174sn477WmN184lG5jxJ0190W2QD8I036Z@WS2C8e04UhKXf8QOn42o90YFHGO + eb7_4nZT0iuIu2W020KQ51vG8npr5aQY230S0A80Wxh8OT0829ra10I180WWG4WWaEAOXW2k + HiWb1GOQ88_Q0XdmaO5a52EGYp269HaAs6W03G80DbfmLD5S501NMWG5IISwK1diSmQxWa3A + Fr3am0A4010GOB592AV180W13SamUJMqKE81JqGzIDSZI6@aW1G0WazIA88020200aK31PbP + mNP4iR320100YUe001000aW0o4mW8vA8gY4UB8XU7OOt056D0ZY0AOhV2820G00G0evD2Qac + WM4M80AAI10X82A040ImS2SSA63D1aHcPN8020G102mis4qN3172a0W000H000L1q0880WS1 + Qe1Z4Y1uWvoy8@uOmII2g4aW4GPI82GIIWD048H881GmrWCiaK89IgWaC0999OM222aaab88 + B902IIYWeaC1999oOo0GO99GI00o44a48989oI22a4YW81P9aJT20988HGIIhaa448899I2I + MaaaaCB1Ig1mWKLDGGIIID040IIIAqwEm0IIY0aY2QPQ92G0HaDa48088PImc2ii0088IWaq + 40991OMGG204aa8939122IYW8WC9989G8W4O0815Bx1081PG22200Wa4v989IGWayM9WWWaa + 890fMNJWiaa4C89XMND8yL7c0WW0RD8yrCIPGXIEAusz2IrGX7sU86W3_XZW87K8cU52QeWM + Hk8r19Qh0Xmmm8sG2Y42X6DIeN02A8eWdPVeiT2_P1X42MO2W3MpOXXRKuC86Q1mW7HEW020 + GQqW0GG4P94304000I000800010100WW0D7K0100W87D0401uxOAqY11V6Wm5R60A00Osh36 + lOYJ0OezoMW0WWS8l2m400kEW0m00030eGE17qCm22080g0mW1U8O@054002avG6vna3010W + F3UOu42oplYO6Ee8V4gisYRXXPK1DG021K3m30102UtfYS9NuqI42FHXQ4qug02gGAZ83I8q + wA4Wi4898HHMMIW0a4CP91DKGII4aaW83D11Y4a59918I2o2a4WaW999r_11098PXGGIYa40 + HYIIYa04419D1IIJIibiebAD1bGJGL840IGIgAa2aWaa8990fA42e999K5I20190J4P1GIGI + XMxX4aj0P19AYYI2WWca92f8XI2IYW404O198Iaai8PD9HI06gaa2aWaa099910ooYWka48G + IYPbO089892GoMarDa809154G1DcaHR15K3G61dm122WW19KePG6Yam002G09WiWW00WFsCe + qjC2d89J0oXossp499POQRRrMaYC5ejDTV2AarssidTQZobwcjrFDIpJO_sJ6Y9Cs0RRFHm1 + ecXbjERKbI0XbjQVQ15smsgjTC4RxJlssI6D9fYQRRB09308RBRp0W20WjjFR00G2Ws_ij09 + X20Rpos01G2CRtsM0AG2WfR9R0EG00jijj14004Us@i1002jE26000XMJ0IP29001YM91X04 + 0090ac0a000XGQQ4W180K02W60010421222098304eWaeG4i12M2816Z04G0Y48K0m4I9K40 + 1G20WP00W0883090WGWcaCC8aiX0gW8sYMcHIGY4QBJs2DfGIC98QZG0A9CK3QX090PMebiH + Cal4qmss2YIGYOPBh4P992ORRXM71rsssGh9G20GeHQ2O0881W9B90A0W21cW44OGY04J24K + 0I64W0WGG21O8J0G0u308X788X0WWCW8Ka42W4a02Lq0E4IIa08GW8W01I90081W49Df059D + 0BfBRA9991j5fPXa069s62jHIGX4B9Is8PPI2BoIsB5IJ2DOVR11999iibDXW4a06tecGG2W + CsssGhp0I8UYcmN18008IUAQX4a0e99b50GG0iaaGD2G0W8qbeW88H20gomq0019XDJ3R0W0 + GWifb9m002Gfjj5H2000asae8CeG2Aooq00018D9JR1090GfIRJ044408D19P472e8910000 + Yasa0000GbYqa40010GHQN3G1XNJ0202pyhA8qwBOPfI1IG60ibDFA91H2KoIgNacGGOBJr8 + IYCWSBqSd2a4DWEfn2X262efEc40eO0m6s5D04A81sqeF600G0PpcCI0a4X3BA1LI22mejy5 + 0984mVq@Fee08oxnxUaWi8nRVoVIYYamffwV890Iox_sF8K2ImR@yV4A18Xd@yVaWaaYl@zj + mHsYa@@FqQC0qaoWsqc4GG1h6RxJsD91A3jjHQX00jescDf628ibUj9B0cW42r_caOR832QR + JYW5i509j9QXiaPR9fvQ0G24DqcjjH3KY4R_adW0881PQRQ0809WQRQR2W850ijDP30680ss + cj10820QVas2O02WQqcs0O080KQJQ3W008ifjj24W40qqsg5008qQD2vX1G208HQrmeQ4SYL + 1NVqGOPWqoO5f_UJs04qA33fzi0W01eGXgecp3o7GX3w29f06AGvakRE81j26oXX10Iu@e22 + ebWq1w0420Gi0FSVj1v4qJM0DqVi2H7MG03ESri236GmL084za100085G004v0630m1G10WO + 2uGXW4GpQ5q6C1020W2Su00200W0G6w0uW24OW400G15702280GG400WWaN2CeqB2AH8XV2M + 0804mquAiiNA91K081441m00T8GGx05aJ023WR0W0GWBS9eXB4o9m0W004v4K0G0W0011000 + 0I49004h81r5YmylHaJm19UrG4nE4Kd52GI0g1eYE4n0800G_4EK@W2fKCH116Knr871KHE1 + 4S5n3hycGy2FqB81DdTGf0B06009ShSIBO4092GT1O01000W800a000ExG1800W9XaGy48y0 + 01x7IG669yS93L5qGl1Eqwb2XMV202W00P2GZgYGq04aJ01pSLGcx6aJ028W00In8XWwA8dW + AIm6XS2Quib3o90ZGhv0Y40mOK6KYA2x7u0G00cI8K0800nD0B0300ucKW2dO3900WJpUG02 + 601G0ydX440105FC15vgGG25aT0120mGMLmWM1CurZ3YZcXdBae5PJgwu180000R01_ulWWA + S8DW56emWVTIePp3cF6XfBBeV46A8eYtuo8D0C63kWC19eL17_07XLc9O4W3040W000404A0 + 0K00W0HK0C00GWFFK6Y7z0SHggM0e0004K0100GWF2C0804Gs0C0GG1OdW3MUrWu2E8BA2Yz + m0G04080W0YLPXg2SeDqEi000aX17a0G004K04BB2G200B4W00208feI0W88G000WG210ofr + W5HE0IG0H6AA080YPh82UVXX5JPeM79cEeW1CG8yLGa0004gI2fII00000210054L088eWU7 + Gel7BknuWT0A0H00GKHNaL03x62HE1XG088400C0904WS2CeOb2W000qpG1h@G010000L000 + I00o8eWuVMW004GL050400O1x2UXuWONSG040OoDEiNR1bF1HJ1O0OH0e1Q3glWWnUA0W4IK + N2901WG040aHm0BO000Qdx20000qx32fAImkp4icZAX2aGQ0V0O580400GHr4G00G8pl3wSW + WL6G02G0W404eKBM8dW4YCTXS289FgDYJmYHAC0200m364KE02e000wbYWSDC8E02W104qS9 + 1VVXHSFbiF5D0202_7WWu1IeZz3QGGXG0CGW00Gz44qZO3dqWoR0B4SYAx1OmzAG0800Oj42 + _4mXIOCeGw5sjn0024020000H00qQw1lMfI76CaXn5JMGmIrJqM01NAWGr07K0K3N1Wm@h40 + 0G2OV0DU70XPLb1W04mv080240G244mP96KLW101406ucW95EemY627XWqG801W0m007ydH1 + 2809gBGXn2IO2W240W0ayp5BBW1G08000014400@0m0W120bRUmb07aHV1zBemo9601W0m00 + 0m1A5S1c12811BJIXDnE8AB2gxW10300d8mGm9Yamb19YGGOP588808VX48001SBm115G0WG + 0ed7IeBK3ILW0GW00pcTG028CDH6F4rGerbW004G1099KGo604Ya8BB1Gco0Ya0eL9PO5IIa + 0e9890II0ae46jVA1ajCW8111J6HQYWaW02IQGXaaa01B30GI2Y48a88L2C4W4899912a4KR + r809199YL34Wa0KdQ1IGoIg1W02IGIf0GGerbWW4W499094GoM44q08B291c0IW4WiL9P90G + I4019O9IIIGae648809H2YM6aa0603B9I62IW089HIGJ2aWa1A9812I26aa44899010IGYaa + 4Guh78199GIIJYaWaaMNNOdM2os_XQ0A8DW3o9W2W0i000W0YMXW07C8ME7kxeXi7C8VP3ck + wW46SWW00HIvDbMD1j3Om8H74q518000Q6012G0Wn1a0400aLwWu@D8E6O14002TDNncj4iA + f9R8OmVy6K0G10cG8x4mWUcA8A12Q0WWMtF0801W0W0Wu4E0a80mt7Bqz_2zkGHM0BCNa1JN + FIMUC0180QXJ3wtWWzAT8d034080zys2B7sGE1h4rC7TFiHHI54GG15gOm63Oqn04bV2JQqc + yAZ3h6qmSADq9W23rvmO0AS734n_uIO@L0929GIGYYa4a0090PIOcIea4W8081HMII8499FI + MII44aa81191IIMYaiW49X98I2IGaaW4GM0I4221MIo2aaaaOD9994a2OI2IM3j30999RCnX + efF0222IQqdWbae2989PD040999J2o62dW441009YIIIa89PLGG1III063W0Gm2ItRJGd05W + 8aaCd05ia4a4Dm22GIIQhEYIjN8iVPG204yE113Oim2JLiZ12rrOGbX9qEH3G0W0ISIZGYu8 + r1AWeHn0RRTn0mWdejj5R9Ro0cssblDbGGARp_szXZRAPxosqCFPWPBxTWeNs6lclDPPIN7s + _Mc1l2XMMwgjX1533Rhssm0Zb4zERRHac40gjjj14W0WillD3NG00Mssi1KG00QPns2G040y + DRR3408WiPRR3H040cjjj1G000qsss4C01I3WWGhrW4We40a88uMmW42GWWIJGm208W08fCQ + Ya4001e410COG118014YGXi2GW34GcI0HrLWWjGGe50We00OqmK4G82QGOOQ98G95280eO40 + W0XXDPRKa09n06aDYGWaG9MsM8LMIYORRR49D91JRJR8998YbjXPaa48XcskjQ282sqgHG2Y + 4ssMerPGBQEKHG85081NfC1ea0mW024423000A2He6382a40mG60XGW2a1AO00H9040W0IKW + o20X00444qe2Wo2GGKk4G2GW801M6a8880a0eWc09Di03PhK8894crj5WcqaGyss62IIYOGR + Q6581IOPRgkc0GQRTMW8fHYXDzH01YbjiP4ca8XjjDqQC80IGvscYcY008GIRQa20Wa89DOO + 021Wia6192Z1ae6iDf00I20bs4o00O80PPQY0W049zXfO004eGz5Ho1OWc4ia9998000Amaq + 08W00PQRI0000WIHmoYx8GRQJ2W000eDD9XMJW8991W040A999xeW0999900G0g1Y0200Gca + a42jM3rMgY0G450JRJnI2GW4jj7MC9Om0McuXs48B963bm1K085h4Q@04WC1U7PGWWGG2enf + 6103XGizEL30AI2sW4cYa099ubscIaXa0CGJJ3G0GIS_t@3YoIYCwpl7180Iyw@_d0489yxp + _7KYaayjV_7Iaaaiu@@7HIIIuzl_79999uw@UFWaaXMl1o24Grakc0GR8KGJUoE0D1ACjDQA + a699rci9LcWiaaAC953kmMearb4RB8HOJAJDae31ejjHAiC81PBDIAWm00usijDOI4GOYrq4 + D8RG8QRVA0320KJRRJ84W0W9j9Rm020mcciDO2W0GQpsM00W0KlssM8100WIRNR0180WjjjL + G200WcstGh3vv32MTvaTe3fjCI_ix410G0A000Q9nWO7J8aK4ANxXvWZO00l040WaZo12820 + syxWw3IObQ2QEGXP5SuAf2wnzYTf2fztLQUXWY3Neby4s481W00WXrr0WA8WL2A0G00GI06C + Ha6jq9pGTE800G0002IZ0Cqcf2G0W0UXpWc18W000Gy36aHW2byYmN5O44D3jcxI7j7W00X8 + d070C05q3L4TbN00I0Wg188dW3_ZaWc5COQ13seeY_298T76Y6eWfiD8TGGU6WWQ0G8xm6U0 + G1420GVTKnR04yH03v9WnB7ZaJm5r_LGh48SrL4XaMmvuE4dG2v40n00HT5C140200010X00 + W00a4mD660GG08pO3wL8101a0z4iGq36K201W00GYk_0IG00hS8Hh15Sb15XJKY080Wm1984 + I2010iaJ03jYGmx974511HEWGE1A4FW1v4qG0ZGaJW2rEzGE1B4Qj6n4Smqj74kO14008s7W + 01W01zZTHC07iNm1pbApy09Kg02v4GnUm4y@@2f8S0440W1fPOvt3gkcWN5A81X5k6HXsghv + F03I30ZK8D0G20080GWqHJe7I202002G08vVb5U4WXd7Euia6Y6mZ2vZ8lVKsCX020000500 + d5P124G01gRG@v74ct2NtZGN25COE1TWlmB8GS6Z6n_1ofg44vE12200Y9m040200X00JWXW + O7AeyY444q0i311RWJm7n44011800GQNUXhJD8D04QuOYy8IelY8omu2GG20W080kH710000 + c42003W0K301hgJmw1547G1220100400G0WOWu3cedWR6Ce502g2mWs1OOZMIs1Q42108XbI + 000W1002Wc40004H0s043XJSG714G002u3434002ytu1z_UGP05Chn230KaH0010009v4G04 + 10ZcMDe464EZsWS2G0G0O0040G50005BOGC08KKm1@gJm00yygE6W040k3@0100W@uN0W0W4 + 2I0I000W88W00004W900GRk5800WW042m@h6ysP12400ct0XJCFuk044C00CFG7@4XGbJSy6 + 110002m02045m1t2K0W0W40I0Iv4GmI07qRI10904sReW0h9OcM34220qqq5hJomhJSaJ02X + MpHjBDm040ujX2G000z6019IKmr34GGW0e602sn2XM1GuC12YceXOREO00Wkje02G08pOWG8 + 06qRG2L0Gm7DD4SW2H5OGT3OaLG3ZsiHS2USEX1v0i08800110835Wm@QdCFhAPOq2m00mD1 + Qe3Z2IT1Yy08eY3922mWeVk9sqI40X000W0CSZ4UMe0e00000e0YwgX16E014Wmr55S2p1W0 + 0YMCeX5CEegc9w7aWb5QXG0I401WWhYCW00028W00G0019gK02W0Wq08uS53INGX9g9W0040 + e00YA3C0aW0mz6EKlx2v3iHJ1Gawm52080g1e0WW0md1GGn540G000408G@7P0500g0X8cT0 + X82KO8x2c8OXyZZ1P8AZ2IG280aW881HHa0IYCbW491BAYW024aO8IIoIaW4Wf89BGGI2YiK + eK8D990WoIaaWc8XG3YiaaGGg60IIYW4aW09998I02Icia4kGbWqeDuTr2Yak0o2IIjLdGer + 789989LL2Cf995QT78FPP12IG0bWa40999YMII094a81OH0M4G0042OP0201O91o0G2aWa59 + E01I10GCiaW80898WaaL8981GGIp2280EI224aa41899QIIIo9W0baWaj5G04aa49f99v4G0 + O999IGI2Xl2He144_A9huiGQ984wG4Z_IGnNE4RXBXMN3W00aq18udl3YRY0G00GDSSW800W + XuI8jY54010y6Y3p2OmeD6SMG4JdTGK07qaiC8004MUPXh1A0100OB15030GW0W0GhK5qy41 + 3xGmIZ9ypY2bFPGdCCalIHW002QFmWV0I0300Gz6AKua1V7amx04C893VCSmVJ8aJG2HETa0 + 00eBsIuaFcIhXe7fIeqb8ct411005x1ymuA5CTi1B4WGIA6S4vAv442IIm64W4aG9JBHGJIM + uH1aWaW899QGI2G481fBIIII04aa8889HoII24a0iZV3G22499B8uIw2I4X0J9999YGW919f + QeF0II2IDqHa8Y21dOGb@74Qz7811JKIGI2beD01989oIG2WeaKe981HoMGYa49H0oI2aaKa + e1CmI0IIer4GYIIWaba0YGmIqa4a54SWjW4a22KOe02iaaWqMW1IIIIWbaaK301iaa42j6ZS + 2u8qQ4kIpWIeQ0G00HAGESrm2r0qmvfB4EHJGm0GWjjlP81PXqssc@41GGIRRos2q4HdjPRf + WKn9rDPvV2CccoiijFS93z3stNY0D9j3xRRoe8ew4xVrQmc0vbjLVPG6nWbMajt02WH2rsot + 00J08dQ20Y00xsos01000QRRR21000ajlP34WOWijLP34030MMbl100I0Qrst280S0qRVPJe + rQmoqM20G20SR9Q4180GefiO0a0OXKYaWG0008H0W0008CaG5c4004G00uJ90289IYP110aW + WO1DDG80W0Gpaa88G0aCG0oG08q2oYGRP008T10RJQR8909YjXiPaai8Xqocj0IIer5eqaaW + fDXD4aW5noMoCoJMaGRRYM88HGYXD1R449AXjXMdXG404N444W0IG0BG90G99K2W99Ioa49C + Y4aFHWC30nA9a02aaWWaWG2AKK39ALW00IGa202e4w20K001oG10G2300VO4e915WWjE8qc4 + WbjXKRb449XqQjj0Iaa4PN7e0ntcsCIIGamoMojIIYaGVhcM892HYXQ1Ra898nmDbD2aGaGe + rQG404m99195H00Waqc040C1GsQoqGY4WHj9UR5000HiQR1114408D9b1I0O0camM11080II + Jq2808oI0oKYW00189AQ28404qjfb0G020oaqm2000Wsg90G000asa40000GIJIQeY0J2I20 + 101KIIQUl71QI3Ig1W0I2I04W0W09e94Qj6gizi199B1cocsda04RQR8cOIGW08bO3E0H01k + 1RlJ00e64ryOXe892Kw_W2qa108NNf6I2I0OzN43oMW8aHxF2DHKGqiE@c001oOoNk5WaW1u + @i@FdQ2yx@Fg4Wam_@@FI2IIm_z@U09BHopVhV89HGoplrV441Bnp_lVIaabmh@nVmIMGIer + Q098fKvzjjX4o09qcqy30H06JRZsY40POjDoIiL8RB9oJI1e0W5gfl9H4W26qod4HY8QMQPR + iIG2XaQRZc0803IiDRIZM0b9k8j9130WIYqcc00400rsts42010ORJp6048dQ240014QT1jL + JWf500o0OQcq680G0iRRR340b0ajDfbGhtu@33A@mWcGIetD6Y5nWLRgu9W5Ml1bTSg9xDH0 + 1000G0Gel48wkHXbJKu6nEG000aVo9jFJ0G0000180JEHmkW5iG01jlMmp18yMG1R5N0010X + I08O@05I2ocOMI1e01GN06G4008FD20a006I02lGH0400800G6Z0KmKC50K40OFX2Yqb0009 + 0HAK0820WfSDuqP3ASuYdvEO427wdC4K000x3GmWK5ism1ZVQ00G0aG08OB12W001T2W1k04 + 02R2Xk088UF4AT0X12Q81d3sr372100zBQ0204YQKLO3P2sDG1O010juT02000I020T3OG7i + 646_3v4Knb3ZyTX53uHGD07qWW1B2mmA39S3T5hlMmw35q2s1@JGHT08S1o1t0mG245Snn9f + Wqm605iTv1zIwGJ3gKT9GZ6NW400G00X0000m0I0ICFW1l2W0W00mOS985W2ch0XM@EW00G0 + 0W8WHCLOmXHoCkWVAH1200e0G804a00NvQ0K09WS2MeI03kjcWK0Aekh40401aJG6XM3HC1E + aJW5XMhnLQCSb73r0GGn0CKui106G0YnWWX7QO3W4wMbWMJi9d0B400W4eG1V6G0101a4i8W + W04Gp56Cew2nLG0HGGWJAEu9E2QVmWu4EuA@6QOrWCM2wIE2YMnWh18W0W028000G2011DOm + b2Di101ZwI0WW0WpeH8MW4wpZWqSJONZA_W018000nKqmn05aJW6htNmntAC3024010I3uXm + G98q04_x9ZQ0EOo39wnkWK7Q1WGWGD04aNj1jQJW2800W000G200Y60X50A0500O218yUG1H + 3WGd77a5o254KH125yjB2tdKHu4L020302000H0800m280a19cHa0X010rmSm6B8CS21VVJm + r37y@G1nkhm00iaJW2K000e0004g48r9KGS04W8X1u4W3MD_08G40@GmG2c9CU92LGKGL150 + 2W08RbEMDy68800r4K000Wic890120Gn2Nym02@cG0800WeEE0GW00001Wy1C826TA7WYP18 + 02o0mS94G0IGS6W541015GF173L0A010000GvImmb07qQ011dZm2YZiOC31GO2GGGY_WBW0a + WmbJ6SWn122006J2XUjD8d09kWdWS2Euc0CkKua4RueeV2A6W00290F3GGKpCKty1H2y010W + W_II8e9O2BOXx0uuZ13G01046T2t1KmW38amW2Z0KmYKA80018JX4w6YdGh3X040GZ19W180 + eM96MDXX@YWW000qbe9bJm50Q00k08XB9B0GG0mO14G200OH25G20GC1A35CWH6R5C0GIPjN + GQP5q_53Lzo0W80WNfUuhi4cIlWqQeOe06UR0XtF8eBd8o_XZYQAe1W4M5WX9zAOEl4klg00 + 2204001_syXGkF0G00GKk9SEW5lXqHWJOW00800420088W@8MOOd24182CA01zqe020WWInI + eU0301C00G00SC032DoWAa29Ic2ErfXGTk09P8hI0228Wa50O98HM0q04ba490TfKY2Gaa99 + I6oIa4q088810IIIW4Cbi6K9W4W4498915bii298P02MG2W4a49P8BIGI2a4aW8D9B1I24qM + j1IGI2aaaa8899f6Q42j_18999fgM0MI2oGhv08P932200gWW588109K3aY4b4091HWMoIG0 + W89I6II44aW8899GI2IXaC58e809020I4aa48XW2C1R28IMIWW4a4CP8BIG0YoPXerr6o0WW + CQPWqa0KE194QT7d7R0200WeAE0810mc594yw4ZkvGl8Kawm7hJKHIIOyW1101028000i0D1 + 0100A9813200P2Km7B5KUH1T4ImY0GiDG4@JOG3H5rMW1h3WG328i1b1010180W0qEO1x4cG + uKAy4W1aW40Q3eWw0GOtf260GYnnF84lCYX93010WzKc1010Xu0Ke2W4gRGXS28OTnHo90aa + BlejW72Om02I0098O0100WuBF8dX9gqvbMPs8E1AI1mWQ0Iu875op3X7NW8O08_A0XW0G84W + 3c_YWZ4ouqW2EenXS2e0OR992Q2Iei5a8e91GsIGW05a491BBoY2Iaae9WmM2q4aWOh81GII + 2YW0ia2g9W2qcKa_445R109991GGIYaba0f891I2JIacaaLXe0P909IIII4a4W2jEYUiB8Dw + JGsMIY4ab4AR992IIIWjaa0G99HImo28C4489IYii549998aGI0abaa080B9I528899PIII0 + H981IIoIWaa4LNN0891f22YWi4aKfsL4QTC1gJGfW8qM@120A26jVXqJG83YDA9BaGhh1DjX + DRRROm6MrijjrG823ZssscfCXDCRRRUD18O8RRrsGa04ajrRRO1MYaMjjjiQSR2rMssGVe10 + Msok9f102VxRsWGa0FzjRBfJbY0ocij12H0Gsajj1CG00Jsss0C900QVRR2W000yjjP340PW + ijbP300C0sMji100K0QrUt22190KRxRJerQmMW00G2G2S8I12901o8iW014W094cW1K02WW1 + G545I64a81KM601G0GA3R0888120512aWb001iO9WnK8W0Wj9G2qK282m00G0gWG8O8G8311 + 3PRR8O99YbDjParc8Xc4cjG2Wa4B8ss81II2Jn2s8HoKY5R3R499A1jj5jWaaX8sq4gH228q + wDa46WuX44WKGGYQO1A22feG2De1AYa81q8c16Y099FKff8GWW10m6K6Gew03120h0C81208 + WG18nmG1C02100P1YYe9P06i22Wo48GSN90A2ImotscIJGIGVBRM889HY1aPR4W49nGkjD2J + aamoiXjIq4aGpsoMGJII2RR6R8918YjimP4a46Qz60110SIJQI1mG09j9DB1QG0acqgD0eG8 + MJoqI1000Mhqs52050WQ3JJ04400f99H020WYcqKf80G2eqcCbC8000uIaa401015RPQ00aW + aCjDj0W00GfD9PT54e9B9fjQ20D910G002sca00200baKcr0GWaac40080GI2HghY0IIG2XM + hXBBRJG2IGWjXff90f0aMmYD6a010RHoS3QW21Rr_M0W0W4LkUR40622DCij81999MssI1cW + 01qs2@X0482SnsdmGea4ufs382WG06jYZ08080Utz@1189HUs_tZWa49UtU@Jo2a4_xy@330 + II_d@_39I4IU_VzZ8919ytV@Zaaf4S@tk7IIsGht003QfQRxR0i8aGCfDHc2Ke4csaDL18mc + UJqcOPGI0UqqqYOHHJKIVI38181ejj9Y6KmWqsqeXKY4ira6j1QR0WGJqq6i1BGiPJQ26C08 + 4Dfj5W000g9jjNIc0fjjDW420msssAG900GJRhM08O2KRQaMW001WfPJR0081mcjfD00W0Gs + scM2jEalQFPRJ4QBka104gwJ4UsXYDQM0400W000W0TSfr4AwI26b0082020EUb02G20p2e0 + 400a1MMONXEA1uXQ3E8d0X_HgW71A8rC224uWE5C8PW3U08X8XketX6cB0Yszg8l8N0800aF + G18108Q7E1028032LGA07KF72TASWG00Wc1EO4W3040Wagx3v4Wmy2ECLHAtHI042WWq0E01 + 0wI416G00108000210WE088d030K04isq3W0G0oCoW70C0K00IE1Ji2X4v4Kn27P4zA1hB8n + 306KLS4rsQGc0G4qa2rDQJE1OKWF40D00or51G20Kj6BI719C1G1R6KGS2BaLW2j3@ItL904 + 021020011001002PQW001W008G0DgNmw07SE01VAO020048010pMVmlZ84dW4bWHHu4faYF1 + LLR0G0GaS2KOWW2o9GXh0G8dW44010aJ01zRhGE19aeS1v4KHF6C4Kd91IMGLKAaCW2DGu0G + 00We1Cuh03UflWU0KO9t9sj8ZP0i833Ds5mWED8OW026811060000W168G1G200LHlmkb6CO + p2nvUm76PqmDDDhK0100ms4MG100GhuCapG2ZcaGG_4SZ92H3mHW3CK3m2lEyGE1OaSR11dO + GG16aEG1LzTG6p4yHN5vJKG6DEyov39YC40111989084004WW0000C400S0W0WeNSB08o0GV + 17qf01010062WWiO88FH2gNv0L000nbUGqD54TX4@SZGT3Xaru5pANW0200W000O000100Y4 + 5G1G0090083i7G2G100wqp0G004t5TGJ57iUG2v0PmQfNiZW4TdCIb46WAW084054820000G + 0C00WG20WUeBeS046JWWum9eBk32992G00G1ErK6p54SY114WGS34qCi1j6b0Y000G880vXS + mv1AC1G2j5K0000YS2Q826MAq6ZvKC0GQKmIw40a60uo92K002yLP2XyJmb240418eX03Esq + W6bKu783QW9YiceuEoFoOOYGhBW4400010mIB90e80mZa8avX27B6nB2AqQA4HIDJCCMKZP1 + G0e0wqqWH1AOze201H0inD2FCZ00m0WE3Eu@x223@Wu8HugZ3o60Yn28eN4SM9W04120P0Om + k05W000eS96kVPXP4AuT04Ii1Xqev20002210WHX9eBB8YxnWLLQujX3UkeX8UauWBPo9mYc + GC8ng2gjeWT18Oo736fn10200W8X0oYfWCCAOiW5oT7bdaafIA329YWW2GG020Gew50220wA + X2W0006bR104804000G0000C10mu5C84W0z_W4gsXWd2iefh6UOeXoOs091GGQO6WG020110 + mC14iz31RbO01G0G2008J1K0G10C000Ip7mGc24y5Z18001IhTX@Ba9ANDG820yjm2H1GGqq + 80W00ePW469uWwE8uzs3kq1XpGM81XC4G00S42431HGeERma4rK911fK2I04a0c830BX2I2Y + aXa51P91IIqG8919GIIG04a88983HcYI64aa4099122I2aG98HsIIYa0a51P0X0KB0IGIYWC + i41A81IWiWofc00aearfM08919IGI0aWaagJj0JMIIXMZGggG4Qz589O8GIA021W441908mI + YI8eaW088HHGMI0a49H0IMGHh50XaW45PB3oG02K0aW8198PI2X89H1HII0Yeaa19891nPJ0 + 1998MMII44a0o5W08998v4G0899fAOB8yr7o902qa09Xlk1300WOcL8Y336BUXt8K83a6Ii2 + dmmQ9Aa305020860uqw280000204uz3B2AmWc2IuYb6wp8XFCEP8j4sUyZO@I8t07Q0mW5Ba + Ocb4s3W01W00HwyGu0Ei76551SGerWiRG388G0658XP0I8Q@4IAOXX7OuMe8o9GaLYIfx14k + 7011000f_KGz@Jyj32308rg0QyDG801016zUXl0E0200s9IG4QG3vI142GoMaaamG93O1G2I + 0iaa4PA192YsIi45ae0HIWe4a88910MGI0aaW49Tg1G2Qo4a4aO888H25aK8850f91G2IIYd + aWWcJ8Wbaa41990aCaa89991MII6S22lwJm40481II2aaaKQqAm4aaCDQHG2IqYWWa08H9A2 + I0IebaW8J99H2qMY5WaaXPIYWbi4B998oGI2s3W0aI2I0a0W089B1IIIG198Pq0488910JII + YbaaWQ08WbaaKd04O9999d05QPnWGhx140W0600WJ9Aub12Y2vWb5a04W400000A001lDu0G + 000I0Q0HNTHhEfaw054WaoqjjjPIQ0pqsscjE54Q3RRssmGa9bjPRxZmDCblPVVQqWaoijjD + uLgfWItoYejCC2RRRsy410BPVrsqa80WjLRR0gH2aNbjjCGO33rsss0A3OG_@scXf3O0RBRo + WF100baPR12100skjl1I12Gsajj1a0A0Joss0009Grr7uljj9qQDGR280889028a800W09Wq + s0W02W4QAp0e002Q884208MG20082Y085104Wa4C58e04629I0I40MKa162Za0I0o21502W1 + 8R30G1XWCCf90aa4WnhDD44a0nWm6C2XIiG0PJMOQHIYWERRq499X9OBR4G98nYiXDYfaaWM + sWMGI2I4RQ9r8194Qz60IIJCJJY181AHE9E5G7a48144e43Ga0mm0W62G45480G28I000OPJ + 3e4e9X0iWG44a6X004eWCaO90Y81GI2C4HYsa01VM2CG0Qae2O1C901OGOBJX09886kLBWWa + 8HQtiD2IYcOToc695IGO9smM9I2JeDRHB89f8XTjaDaYq4n4spC2GQ3jc398m8oQQL00WWgf + jhLI00ecaaMXf84WIQIrW0XGYAPI400018eDJQ2I0qGsajf10GI2oqya0G800zKqd4C008SI + QZ62a484jDI2G20aaqOB1W8005A991G002Wccq40000GRJQ4W800ej998O2KIJIEI61QJIIg + kc0GQI0000W08f94Qj6gakCH9f80mssY5W0018PRs8II40WeOQF9G2Ov7pf3cGLM6f5DW009 + 8Kw6m001Y0OJf94OOGaOvQ_6OK14CCJV28H02i6cy4508DGQsU0qWaauryd7Caa4PGyFF22I + Wun_zF10HGuws@F009Bv5@rFa099vv@oF2Waam@@xFIM2ImV@zUOB92jU3904aADlD9IqIWm + sqaVG0WIGRRcK850R@jvRgiHOPhHQpAYaDDH99DDYq2IWaaa8OO80GRRl6AO82MQQsM4WOH1 + jPIR6600mafjP0Wa0GqssMW210e6oscGq000RJRqW008WPfPQGG08WsWjj0W05eMfDj0G060 + bqcs0G010RQJh09040jj9XMpHgqYCiJ4x1PH3CBiERD1NNo39k01018n7C2vadj1M0mG0GgX + F0100ATe7W800SJW2t8qGK2G4CK8j5eG7nTqb11N1W0C0WWq0KOG15MAm08008Xf_0800eR4 + Oe707g1eWb2O8HlAcrp32000800WI5E10480zD01410Wf180110HNk54bq1200WMOmY50A0W + e4GM154oc1rsOG@rEie792G002071W000f3GmgE6S201T3MGvs4G0X08dW2cRpW10AmW00GG + 59qV02v4iGo278100gfx5Q60XI2Ke2W4QQo220000Y0060u0a0000500Y03XZ3M0400G704K + 2m1fLxKE1TC0W281W8w2mYdx88eW2W800KGm8XMZGd8JawmANBGGaW5KU811mH0810W@0A8Y + U2w50XEGUeSW3IMdWC9CeB49gUMXE7KuYMO_kj08H00v4Omld40I088d04oFEXS2YOAt3o9O + Yq1E8dW6g1uWg2Qekn723Z5a8001DhmJbOikw1BtZIu4oK0g12008k9FXi1E8E13QJeW42Au + W06IxmWp48OUx2oQeYYPW83mPknhWN6Q8Xs4E@xWN3G020004G0Wr0C8BXCY6OXT2U8d0QMT + R102000420UJ0XaI8ufW408040808eq65M0uWT5Iugc84090qs_7fE02940H18048W04k5e0 + 11040080m4000W1W0220Y0G4WMSFuE3680G1CQG2LWBH22HCbC41UxmZh8aEO6W602000018 + 1002G0040Ga2CA08880G0820188ra8nA9A0I80e338Ae@Wi1Ce93E67K4G10X0208B7mWvi8 + eK07s2vWS2K87n4oCWW7CCOA18chmWM2Wehm7g0AY_2gW00200mW000W0XWWGZw4aGR1HK6H + 7058K00OG136jyXv18uc72kVnXh6O816Ag28XqQm012010W80n0002080W0GXq313W400040 + 0qOE1t2aGG07KwV3v9imh18KIm33OVGqZlG000W040GAw580004210IE1FyO22f3Wmr19aJW + 1PO0HE1N4I58h5O1820G08H0X1SG4444Ul1Z8PG516C702rkNmb07qe41feWGG17qH5430C4 + W00mdx9eM03m000iy31K000_lvWFa_ujW3MJocu42fu22G0800G20y3W46TP1Y000z9BIK3H + y7gCb1G180050840H3v0WW8WaQGufW50C00yl22PiPnvFeKM0Bd5yGAO400W00Y00JUPD08W + GOxx540204f12n4WGI57e800eL1F01004w423dWG93O08I0000HOKL74bx1G1000002cq11b + VJW00aWO5E0We0ma17q5W102G0o9mWTFAOnTDwemXfCQud04II2ZQ0EeG05A6011010lbdGE + 09i302@KeGw0DST23H4jIE1Ke5b8LBD89K2sS4a448BH91WIIY4WbK9w99IIa4B9P9IJI0ac + K4899912I2644a4HHf8I2MIaH9BGMGIYamaGGg58898fEL3Wa4a01IGA8L2000IM301G1III + ZM14Waa5jIWWaaWE08WabW499982IIIXMtXKKmK0440G0HJH0I0WC0n4821D22K25i7aW10I + iWaa88108DW2G0IIcjD1WoIIaWW48XIUYiX449091BIGIa4aqC998r9G1QIIIY6W0XaWa54S + Grr4GII2oaaa4D991aaa0LNJGJj8e4aa4819PuhY4sF1PkOHvmBaO5Cf@JGQ0iaaa5PRJGE0 + 50100SGZ3C000SX73p9HGI76yOH50020_39X02cu403g3eWpRB8A07AaX39900205WG4W0in + b1ZCJ00100WG0WN6Gn@748W408p47kqtWwHAezkA2ifZ8YwGI20GW04yB01I000@gX0G0800 + 0403mKb62COPW28100S5W5ZScZ200W6yJuL03c6W00600JLnHdFqaZm2lI5HS2KKHZ1PwOGc + ddifb8bwCJO0KWaae48199KJIK4aa48QP98WIIYaeb5BP99IIe49919IIQ0aac48199HQZI0 + qa4asFCG0WaKd9404Wa4119vZr4a8I1O999HI2b4S2144aagXcXEfFWIIIIqq4aY@1O3993j + U41H982MIKaae48899poI20XW44Hh33mI2IWG99Dh210119x4e0YG2Iaaa08198H2I28d02a + WaWKgT2WIIo4aaei201AD89HIMIM301IMIIosc0MIIGLNpGR19aJG9DMKW480YivV8Ne6gIa + WHBIepi5Ik4C919RmsssCb8jr9D1i199wac0015iQRRx0DiTfRRRnqWkAajjEPSGR44ssil8 + 0XG2RpptK95H2PMssa60HZ9RRjWaGm6lzjDPAJ09_sssWFNW0IMgl185G0Rhss04CG0@wRPH + K6G0gjjj1q04GRr4e000ckjj1G1O0qsss4G0C0uPR7Qz6aij90W000rc0aHGGY6GO00291I8 + bC98d40004GH202002451a0mW550Y0mWAGGY0P8X0X8E08I9602PG88aOAW849JW4iC00Wa0 + GKaM202IsGmWc6awGYO1O36X19GeXg9B0a8BXmWjD82aam4iXD2WaaOXso6nIIIG3RJB8098 + YbiXQaba2jU39B1864300aaY87W4WfGK2W8PIac99GICPLB2W1GQ21A12440y081G1c0W80q + GM823u0GJAA40IJb4IGWM09LEX1PI0W4QZ041802CWH2GW40aYcXf0W44KJsY5IAIc0OOs6a + 5HIakGJZ4098i4RPh4Cf9qWjj54aqam2sm6IH2YO2RS61DXXMl10GP1tcaaG481xa_0DDjj2 + 0000zcqgHG00Knb6f1090JGQKqa0001iPQ32W06Ga9b552W00gPjf9002YWsca4W40GeIHc6 + 000898n29W000gLQ22WW400j9f9Gm000maq80100GQQocC4eacqiH22Kaqa4QD1cab001001 + JII8qQDORHG30IIYCza5B999IqssCL4404OVpsC0Y0WSXc4bG4aW8AvZ1HGLGWfDt50eWBmm + EE9W61AWqwS9W401ORNV920a8vPUV0AY22Wjf@6O99JmXr@F088BooHlU4Wa0nrvxVsGYW0X + 9VV88GIoh_@V81IGoxzlV4A98Xl_tVaWaaWVzxzmGI6Qz681G2LJRxJ00e0WjjDw66IjWask + f81KIqRpaVRW60IlcqK0IQ3YQRQQWCjC1DF9LmW66bqc4jq0GWiqci9G91W4IZsiC03HYDRR + RWW98XCjj9W808G9DjD1G2mGh9WK2G0c4sK10SG0QRRr2014QT16020bscs0O020RURh0j01 + 0DfTXMVI2EB4Js5TePn00Q1201fXv2oeKXk1AG000msj8i7a4zs0nb15yyx130qK1e5KjO12 + 200gGGXyWw8XqPYZRcjRB0G88GKI4K_21b3Mmm078001f4W2URu014002010Z9q080I00W00 + EY1XOh9eD02sVbXb2K0W4KHvCHiPN9025063Z00480020WIs6X71Keq92QU_W0eD040G0W02 + 00G02nEKGNS5y5m11LTG_tYKLKAHCJWW88WdX9u11220@WY18O513G0044bz1vxKW400WhkC + 02Y0mGdGCyQ1@SnHeElG040OLR4QIWW8dEeSF2_jyW@1EOD12020002408IW7_luWc0COqX3 + 628XS4ku_M4E_OXg0gW200GVWD00808PgBonDXZmJeST260OBW0000f00AMZ0a0X4r1V0011 + 1A100TXa0210WX3Gutr2AxgWp6A8m13c3HYwnneNfN2cbW0r90W0Gs5P680G10WWWG@s5yS8 + 1v4SX018WxtAOF12o9mXq280G00mM58K3G3v4WHGTNqGS10i00sebW_AMeSJAI8W19A00FFp + nK2LiZH7jTanA5C00000e00ma090G2GONF3EdmXh28eBS3c2mWBFA0400mRb50GI08pX8gr0 + XZ7gejWCABWWT0G8cN3UaeWfcDeMX2k3W2020e7IOn807qip5@8OHE1N0210uia2sdZ20508 + X3SmU0FSYC2h1WmdY9SXy1POaGH18iqf1j5mHm9LW602e603wIWWVB80H000WH0WZZ9eJW2_ + 9W04010H2dmyE50W0Gu302W480y0G1@2mGQ04WO00OPl9oQKc@F9G8022002040097OS0X00 + 02C00laMm268W0000A00oc14q8017xS040004000040IgovXSOIe6M3cWDdfnDObo301004u + m1G800JmXXutJ012mmR7DWW00O6f96tXWw3IuD1DkV2ah4AGX00mv450280ucM3m0O0acD4N + _u0C00ay0CG000Aa08Wyyz8lESG0084ak1aG2064f0140GJ6zG806CVn10C00UTWWR0C8zgJ + MTuY@gAOcvGQfkWS2C0Y04mVZBaJm47K3IXKjK3G2R2OHBI5abG1C000Mmb1400GRmam306S + To1W4000820KHm1HeaGf0F4_JITUVm4O8C5s3dWknF08C5M51TmIS2K48W18W00gr_Wa0Eem + 26E60XV4WuUW7EZsdiViuy030A00CYJ1JLem51DqVH2nRGnR04Krn4f1emi1IyGw9h7OmxC5 + 0G000G000809WDRA0104KjE8S9W1Y000Q2hWyYAO902EGH10I00t7SW010WM2Q0W54mm9BG0 + K08dDOAL8X55CeZ034101iPl2LlVmFM64IW1V9G02G00W014XAO0400Ws2AehiKIv24G0002 + 400G008aAm2pMeG506G8008o98gEmXqecOj18Q0wWAuj8KdBG222gi4a4209W0I2245Xa4G1 + 1HIGWMQA10aaW8H99HI82Za1q09991GQ2IvKN0Waa41GWYW8aa8109XI2IYaaiSuh58A99H2 + IIY488hSg9eEL26ZsWwKDGoIGY4899GMIIfggGD074Qj7H0GGE140o2J2WW1199G1IG2G4X4 + i81996dT1i4Wa8P19aA01j4Kmjs581IM6aa448199MIGIKaaX99901IIYAd03E5e0I2GI4aW + ae999H2IGgW03o9eWmNRe6W82jMZ3HAeQ52041W4E_3fGOmH37in024800w8SeR7I899Cs10 + 101009HqmS05WG000814mF1402200018G8BHK7n2z2KG4B94so4V973W00110G080G0wGiWA + HA0a60me0N4QD1020GklGXwMEu43BkGuYuhK9q42M6eWrlH0000Pi37q3G1v40npSpC00F9Y + Km9s_C0m7DmCIu4QCAb1F0GGA2MiB024G006HC10200f3CHW0CqHa6B88HE1Ke1aa591984o + 0I5aa48B19HWGIYaWWG0v99IIaasFEmW844999O222IaaaW0991H0II8qw28980bll1qi4aQ + @W0ac4W891Iqiaa89911GGIWaaa4f989rdKGrr5WqaaCH45wzdWE188GW2I4H3jaaC818fXI + 62AWmi0P899IKII44aaA0F1p9m09890IGI6aaaa8P199qQ3w4e09898IOIGaa44899XHIGM2 + Waa41989r0KWWb4499B8H3G0D99X22A8d0209994So5XM@nZK6y1I29cLG83AyBJ3pOe020A + WG6k0500mO6qaw05Ks6qbjjj96RIGKssczaj9BIRRs_aca9tjPRhs6DYXDRFRAPY0ma_jDOI + oGWsswc8Kd10@9RseL909RPrsqa00XzLRR0YM0aMljjCKPG0LsssOAI00stsc9A000BRRsWE + 400jiPRP0X00_cjj1Q18Gsaji1H000xsss05000QVxR2b040ajj3jU3G0G08GGAeOG0pG990 + 240880a00X4WC1II4aeW8eC10Wi08w3s8sGH30G03110AGW745pW908850BZ0b89W4aD1IHa + KA0qM000I181HJ1G8900SIR3098HeeiDZO4490mqi5X0aaGPZs68HGIO0so61KoIC0RRZ099 + 98ajj50aa4HWsKDMG2XMlX0ac47GYM0HGI4J0Q3G90H0W0C0GW48WYm0ena0X310580n0ab0 + 4Wc4IIem8RMG50cCX801G21DekA0DI04aO31WC99I0i1G60a61ApI1J0I2QKos4AII20PPpY + 999IKcCRpYa892sWj1GWa46WjjLAaa42xss2OJII8GRQ3b81HyajCZqaaGhv0G0ShsqM5010 + eINR21000elj950080Cyc4j202aecam98H100RZsa0001WDJBQ04W0W4jBD0W0WK9jDD0G10 + 06qcOf0800QHYqWW409fDJo1801GjIIIGYnc0JI20000cC9911I00gjQ3KQJQMKO1aa44000 + 89IG2Y000a999XGhr0jjiD00841socyWW08JRRpE10W6njDQZA0I209AlP0HoGIYqvT0018X + sbuS0W050l9nrW2GI4RPtJGA84az8@R0B0I2a9yD4G9f0nG_PW0Wa0c_w@GWaa8PQ@xHGGY4 + D_j@X19I2uJy@XX899tw@@X0819l_@@Hbaa46@@@HYIM2cuVt389PerRWj4aKjBD9WmG28qs + aiBPBm6NRosAbGGJz9RJaGA22jQQQXWW40AZCjHIva2aqc6H3I06QHQr22O14QJosY8412iD + QR3oC0DsijD1I400Yqss2G000rmss4g800GQRpc80008vDR3K010qsij5q4W0rOjf52000ea + ss6O3G0OMRRB2d0IRRBXMxnLDbiepQ7yMn81uqJC1BPYGVsWaJ0BnyLW0GKWB2qeSb2I5812 + 800HPho000HG00ejI7k1G14600Z0OGBS5G00WOl030I00iNB1H3HnJe4aIW3RYZnuUdC9B10 + 90GoCaXfIB0W10KE17CH31LcJ000000300v8qGC15i0G1nMfHF1D04W083hL020aKKW1BZG0 + 1W0WvvAe6X4AvgWM5E0440Kd08yJg120W0o2d02040H3umM14KIW2v4CIlqQW000uxu3Y4WW + jBB8Dl2A0@WYPJeDC2chkYMNfe205ECdWSfofIZ6oZsWs1S80_2o9OXOfW8E18QAuXw1Oese + B_emYY4AW0020010W_zA8QW50202Kcm170OG604SHH1n9aGd34W000SB32MrNXw08eNk2Qf4 + XR6P9dW64800YW04uSV4o98XS398d05Q0G1H00100WAsDz0080m0006_smWJ0CeeW3o9OY4V + bv7t2g1GXLFE8613A_8X_JYOCW3IGJfS2iufV308W0StE1jXGmwD44mC3biGHVVWiAW1f0uG + 6Wp0X40OJr4wgq010W0JQRmajFS8W140000101y9G4p7WGNaPS6W3hhqGE1N4MI12W20w4uW + iI8000GnIU8qVZ21dQGVl4SzT1pXjmu6AKUX5p3OGaEW4mP505W0Ak@0WW04G100G6000010 + 0W01msF7C1018008sIeWl78Of3367m00X005kBH31K010G833Q08001g0008010050YS28WW + 84mI74W0G4e2X4Y9iW5680800020OWq6MG400maeGiC02C002ADAaLY6v612080GCHW144W0 + U0W05008pgR0W00mXKKemK78001Kmk2vlM0100WI2A8UL329GXzds11K0GE56ClD2V0Gm766 + aXk34020_IYXHhFuM89gd8XuXh8SYKMJ9YhZA8W03wtcW6RAuva5_59X@0C8n82AA0XU4GO_ + 89g7uXAEFv1N3YndXS2MuA@4s@GYS2MeiXHo9GayLieyN2080Wjrx2G404EIW0010XfmamIH + 8avq14010IFOaH7I9IWEQB8XjZH8T87QLmXo4F8O0M2j_cv0AOrb7U0mWt3U8Sr2A5WZ69mO + XeIITe2a000W0008000zzn2W001wEeWC08ee06kweWE2Y8bW5cE3Yo1GeJ2B2bI44480Peq0 + 01aW2SW8eW4U59XgT8W000uL0602I0OPC324mWj3EuDW508100H00u525MU0YoO4PUM2IG01 + G01002004100a7W291GGxcAyB03G400YJ0XIFC0I00mW2A4nJ1r35IY2KG04010400Y00WC7 + CeIW204210800Ol95g5uWY08OQR4gZY001W0p0aG5054CG1j3G0a40WY0A843729mXpWO8Kd + BGGKoYa4a4I1P9AGIIaLWi0H99H2GAw4iW48OMYWaWC9998MIG04aaa8C1912IIcW4CC9119 + XlIWIGIQWWWC1fI0aaWWEf98LL20I2a899BJII2Y0Wa09P99XMRW04XaQ0E8qQ24aW4O9999 + Lr3YOzWGhp01H1ZIGG2v54be091HI0oY4ba8PR24XWW8nI2WaXa491P9O2GO6a402Vj019PO + II2GW0081IIGoa0a4P9892GGILNNWWWaae1AG0IIYqa441891@3O0aba419B9II2G2VjcOBC + ehhCwJaYaoLeW59_MXZmmcv@24G0220400i508EdzY1RBW800mTTAywn2Ph4HT064WI3XiGo + 6D404080W0eGgP4000GvOb4IrvWI3BOKd4_scXB0GeOF262u01000vUWmWACKzp8n9GnKE5G + 0004280mNO8aJ04P2mGE18CX43LchmR3LaJG45ifJRU9KTW3n6y0200e_4K8r7Y2jUZL0quW + D4MKGYBpB0144GZIEaps3fDXI11KWXaa41998K0II4aWa8h9B5cGGYaWeM9P98IGiaSFA00f + OPx75mMIG8tZ2gll0991DIII0a4a48991ncII2aaa4X199XWGWIIGogGM0jaWKZ9A01999u4 + 22jcX4H013991IIAQeaaW8819HGI6g8bW4P1GfIYIG4aO9IIIIqaaW89A9m2IIY4ibaijDGI + G8Y089f@180891Pq04OR999Q03aW0W0WIIgWW2k4W0IIIGCb4a81915Q02z5GGm9AaY21XMB + 200408H00xDG0W00YSyV8qG4kvWXOfE8AW5wkm00181HruG@99yv05te0Hg3KORH22ssskXX + D0JRRVsIsaa6jjPBJRGtqscbjhBs4Goijz14M02JNst0C8D3URRBo8og0yyjOpM00mizLR1R + B04sMjj1fK0HQLssJ2a0DKRRR3kf1CCRRRcip00iajPZ8H10uscj51538uVss68Rhs0A00mk + ijDG200Wssscm0000vRxGht00CX8W4a4OG4I8IG000HGII001m895Hmc4G9WWIIP80e9nY1a + 9Yb54022WG0G0e4AF8q03022IPpIC99Id01P3W489a04j5GYba0HIs40GII02WmcW0II428O + J0R9H2aCCB9a499qGej1Iaa4cejjH2aa4Boss8oII2IQRR1899HaijLZbaKerR0889ma4f5n + a04vW2W0L0GK69P20411I05C1Oe1GoKW0G3W4DH9A8v8141cEIc6418GOC029a0YGgn00Yq0 + 8esI00PIZaCR6s4910Y8jG0KW4044i11om40OLsaG2OY6G8psW41I308PJ4G49WbORRb899X + 4jjj0Waa4IsssGIII4NQRp8499qwDG020uqcq2A414GRJPcIG48fDDHQ0G00gaaFTQ0W4eM9 + 9182000KqMa00011PRJg04b41X9fIW400O95HQ10000saDf10202QsaK00008PRJI1000WOx + QoWa8GRRI340004DDf220004mkKH11AB99RaW0i999jMRGD04OHII8qQD0RPx33G2aafy9A4 + 82HacYaKWW8XOBpsCI2WW0gKw70caiayPU6X2XIufje66085WpIAECa48Ho@z5qe81GRo@50 + 2W4eDzV510IYmyj@10489m9l@D2059YQs@U42Y8mPVxVKGW40_D@RO3GIoVjLRW_@@H1aa4s + @@@HQII2c@@t3G9PerReb1aH9fV90IqI0sqsiBJ3W0IopcA8K1pf9IN5C6039QRQ18WC08DD + jnos00aqq6HI830QAIqIG30cQRpcW5518iDIR2I009a8ljHHs04odssYoY24aacs42A1GOIJ + pajX088fDRYaM08qcej50Qhk02j000ifj@lW0ijjj2q002jsZWFYuFB8kQ5cjuOuGfMkzhZu + PGuKW4Aa5d81SepEO60mXXf8O2C30900C0f1Z2C1014W5LaefI92662018030m3W00080000 + 2G8w0e0W210HjO0W08WT6cOK32IAeXU5Meow7oVfWvlP94190108G008eZ03G001i9G1a020 + Q8e0880000G2800W4ZL1J6S0G2200GG0DTMm@04yDC22W00GW004sL38020IWBYq9Q140W03 + 08WIRAeBL2Qlq0G00800G0o9uWoYC8dW460W0D400DVHmBE7aJW1z0SGE16G100000Gme37a + JW89_UX002W9kGW4W0mQh7qeG1dZ6obUAKEG2B3eGxmaa4G2v4S1G00XC0G8d02AIrWIYC8d + W2I8CX02AusF3wJaX_Gm8dW8wN@WGiW12m0GTw5aj5122200020CI01bCKG836ipW1pMam_6 + AKG025X@G9IPysX3vA4220W08010v4a0WW0WS2Eenn2o9e25200z2emx5642m1HhvGcTAKsi + 2v48HHUQqzW5rawHD8MKHm1VkUIcPa8040eGH709008400emt3cAu18044@3GG63QaQW6XMF + J_T4yX12V8OG987iM1215OmE65800G8503AplWpsR8R0Ec2mWM08eC0Bo9030X80d1mm74AW + Wa08DW28000MvG3lqUGvEMa9Z2FBhHg3g0402000Km2Z80100ubk3AEX010500H05c2u0O00 + 00060c0j0W002X5KGggH4EX2@MqGS2Aa5G331aG66P800W1200WW02aFi902015001XhNFe1 + 02ga_WjBKOHX4c0W0C000P9O012000A00v_Sm_9A01G18plQw601m000B5W0010001300GI0 + MSrWU18eAb60204CcW1J5Wmy5DaJ01@_Smi38q5G1zrAn@Ad040WG0GG020040800bOO020G + oO0A0D00000YWnECuP02W000140e8dW3YqXXcEQOV034W01aMG359aGu4kypW101000920qa + K15vNmJ17SfW1J7S0310W61C8Gz4UY422G04jhZGuaByYyE2002Apv0G004Hbum4I6imm18G + G0U0XYW6Q87W3kUGXS2I9EXAa020KU01RBK0G8IWo0Kuab30I00yx31rdWmx0A4Z13VDW08C + 0WpIY8FTT0118rMW1rCNGss7CH0101GGsC010200pYSGmw6i6H4DIGnJ@9qw23p1eHu4Oaz3 + 1T0emW@5ihH2hCyGfw7KXUAbSbIE1K8e01fTW3a00G0G028303020WCJ410W21ALnXW9Su0c + 7kXaa2We1a40mBI54m21fmP0400YI2A8Z038080CAz10401WC00Shm1jAK0W10XV5M0K00Ge + 2Ayc02nmam00De000uSa3o90ZR480100Hl04qXZ1FyRmXA54pI2zRt010005100bw012G1Wt + W8eF15k1810600fEK320009000840400084Bq1FrGG@14q1W17dTmk96i101220000G44An4 + f0OGV18S1G18X00_UGXyZZ18u3XIIIGg8ba2008HM2Y2CDq43H19GmIG4a8122coa4a00B99 + G22I0jeW4GA992IKIbWaW8XAGO7L20AIGYWa4SAL2WaaaOY99nIIIY4091IIoIa4iawMj08P + 99GIGI4i4b8P99H2qaKVi54_g1fHRW8aa49919XMl1IW6Iaa04GPA0LG0J2i441PED1IWI2a + aXa89GI4WiW0990HMIQW4aa0RP89000IIka0I0I2A8195III2WaaCQ02q4aq0f99HKIJY7aa + aAO9G9999mIII4Yaav4G0c4W41EH9I2IHA8u0Wcaav4eWeaa49819XlwX000mI5eu7a6wvG1 + 19001DiGE7Eq363XMJKn69iI613iGGJ05G2000000sO09iv41rdGGS9NG0G0f@Y3oA8XX0Ee + i_6QgQXvJA1G06GAT40G00eeK2IqZ02001K0000400K8j1W084A6uWy4KeWZ4Yu1XqqOenE3 + 22uWtHE8g3R0KW0y7m2tSSG@16qvM102206nHYzBluaR5cjydXwpO_5D2LxZa4A80EQ2jUcO + 0ceU03U1gW10UgW0AG2M0gWa44A89820I0b1846G191GO68ae04182Y4a441898jVS0J911I + IG0DFVWcaWiNJA01199IYGMaW4a88A8HIIJYa4A92w20MoIM5o1O2II4qaa89O8H24aKerBa + Y@901B8HIII1X04CRR2aiaLG18XGGMMYiWW4022GT1G0G20I4Waa898IH20GYaWW4899O__6 + 8B93fj03abia09B99h4289898aaa4B99PE148B9Pvu42G991HIIIWbaaGO@E0IIGAd030999 + aJW6LMN0480ej9a8pw6w5fWrj88a1D04G4isH1n6XmaISifX4p2GXfX90PRxxcrISebjjOBG + 24_qsciCD4I2VRstE9HA6OxsU65X1B4xxB3aNK5ebjr9IK52uMMsD1G2mo@UzDe52oORzs2Q + 133f4BBBY010GjbjFqW0KWjjjPQG00mttcD88XSg9WGn941PPxsgL0mtscD80WQ0A00008ss + scGhr08DfqJ840aX8660106qo08GYYKI92K140G200ImW08YZ0DOG8Y0GW0eeW090C42Yoq0 + mY22Icqc0G0I01AO280156aCC80j8H14IiiPJva04Aif9W6a046so0I0I003QR1C49H45fLJ + X1KRr78sssU3Q2asss6QD1sss63jk35911611e8c6aAd0Y0XIGYqGQQ4W810G4CGG2WGoeA1 + R82aG1D19089a62ZX4W2809GW1Ig240KGf49Y400muI310II04ST019990ikDGaca0aicbee + aa007oc4OGIs8BPs6D9HQqy8JZj0B0iTer6mssM0III2PRRR8999Yljj@8WWGht008SdaWI5 + 848ewQQI1a4We99DL000W8asGh230WeKseC018H0JWYc44C90DpIHOa0W0eDD80040Kb8880 + 0I04aKce108G0RJZsW0408fDJZW081KfIJI00W02AX9D12G00cqa410100QQIYxX0baaaXAM + GerCOIII8qQD0Jxo3GIN4ab95A011IqGoiKaa0XKRpNkI0E4GitE6214XCmp66GMSGW11q71 + 89A8GsFE5WYAXzfz18b9BPI5d3I2X4eTZdB0GG0Gyb@7808O1yb_98889Y@L@QWCa0HuAxVG + 2YaWu8VR0XsgNmZbaKer4Waaa4i@@l7GIoGht0202hQRRJ04C40eTDPNm020sqKDL0hqmQQs + sQJIm4QbqaYG230GRRJ34895ihDfYaaY0qkagbsW01bqdj5Ro2g9W9RH0mOIJc6f40HeDHRB + WaJT141A018QRZa6400CjDR20001acjLZm@54ejjjfjQ3A@Y0QRRBXMhnAGF01G0er8B0408 + CIZEPsiJ799C8G2h4G0G00W708eQ7BYsrXQYF8XdCg@vcx1CW800m8A4yqa1ReKnj29qOQ21 + @QmjmCC0mKG006cQfWs_AOv03YRvWwc8024GGQb7qZ82x0SG704G222u302w9WYkBDOLP4Mr + pcX6Ledc36Om04I00PCS028048010jEm0GW0WOyM1800msvvGG80uQW2W0K0iXO10500UOaW + JI90X80GEN5aJ02bIGH_ST4reAR7W140WYT0EW04208W0Wn1CWG00HIO5G1098WW4kLmW81M + 8g52wN012000aW00Y2mWg4M020IGW1GCHm4JCiHJ360G18O315040GKoG1PlNGX0D49m2W00 + 06Ildh7512Y0mtn5yT912G2WU@OX0488_02_0eWk980210GB8CidQ18001xAa00108TcSn4n + PaJG82004O200CB01v4aGNR780118dW3AQGXe1Ce0D3o9WXH288d02QHkWQwg8eEP8001qEF + 1lF5Hb04qZD5RcYmjAJq593F2OmU55aXHF2000W442aX01tbIW002WX4AOYb4oFfW60E008G + mE8FqpU3W400oBHXp2C8wX308004QW2J40Hf2PC3G1GI000048Sgv1LEKG82A4dG2z0GGg75 + ai03nhemz1HSEW5rwCHE1PqZ918000Mm@W92Ce102G0W04x02O20GEQuXsb88m434102qzTG + fES1010G10A0i00W2MX0a00GvaKGVf4iN61T2GGoEB0G02wSq5YJuWw49uM46A8GYStT833M + G0G4iHB10010g6W0I10G0104_FkW@GA8d02omm1G400H5KmX28m200Ov1CUPbWsHI8MfQ081 + 40W0G24000100410040040sSeWpiFuK736E813004X0Kmx044eF1nquGB7LSJGEF7L010WWS + 28OHW3010062E133gme4ESHS1D0GmlZACp8HfEGHy04yIP10I11V0W0O0019vI09H0Xl0I02 + 092G00YgrBeSC2kAG11GG000502O8X4zDu0Y7sKmWB1CeePQ4004K70144400448yqa1a406 + YVO12020HvVms1F80009l96o9eWgce8d0HYJW21GuoHvO0102XFNGm000oerBy9W92000AcQ + YChrPmr3U6WWygF8aX2W0W0sGcDL4mJ0dWW100SeW30400qf519QhnqEJKJ03B1WmK6gaJ06 + A080w5uWJ78uSb2_bi000a020005020qr011NNmg0PSvH3V4um_xCytaC2000wG812W00W00 + a_KtWOPFe47AQnWXfrO0104GivDKbX3Ts4Jgy5030000882018XJ1CW080G3j4a6G1pEmGM1 + D4Eb1jGd0200WAR882_42dGeIVC0100140GWiD80W00JNUFih31bIuGq29Ccq2LwEIeEn0bb + W01899KYQG4W4a0B180WIIY0WiK1OE62IqWWKB00009WMIICiaa819BGMWMMqQ1A8995III2 + a4aeRL2Wa4409P9HG2IoUg4K3j1rfUGQ04GQI2erL6IL5XmNV8qwBmoIGe0Wa42G99020AKb + a481C912GKeai0081I2aci499988GI0a0a4O9191GII2Wja49189Ieaa89C95DG1GII2a444 + 4DG2GWaaU1WWS2K0HIIID04OIGI0D99fI2IoS2k8qQD4200W000fY17800Wqmm19WOH4zAy2 + 0499X1108WaaYPuY3W00052m20I20Mge2400WzyNqL0d0G0a000GGtG48000W0100W00msj8 + uRZ46meW5088I52oAf0W000pXH010080200Pm8Hy8HqCU5vhK201O000044200cNe0300000 + O26RmWR3IuEj4o9mWkB@O00eoRXX23EOoW8o8wWpFJAj6J0204CRS1L3KmwB7aiW5p8SGG28 + iF14n0Kmv36ioq7XMRYaaaG9112IK00a00m9109Z2JIYe4q4R0000aaa89f9LGD2IMIQQ@W0 + IGoGaa44GpoIY4aaC442IDX0II22aaaWC999rOY22GI2g2HXQ0Q8H43UHXW4H619818I2II8 + 4e408D9HM2GW8aa40H80Ic2I4489II2IbcWW81990IIIY45a4819922IIiaaa91IMEQ09819 + 1PIIIORW28B89rO261dy280G0W001bWI0440enBA8302oneWUjaW100m18EKe81btGGK7Naq + eAL1G18484SRRRkK464jjjPd31IsmscjrC1AeORssoXn30upot6d8914RRR3kqE6eili90J2 + 1usscDROXLosMbD9001Oxrs6M80DeLRVBBisoGjijDay0ibjizAam0YGoocDi80aIxRMRaa0 + Cnl7Qj8E0000jjjb911ejjjf000SzB1CaDaf44481c6c8020aGBJ6GC8224e1B1W08He10B3 + 0Le9241XnWW02001Y2M1KW8HIB6409I0A80281nI8i89Xa49406a95Gmcm06aG4140200m60 + 04I699O30MT909Di91Wm8R04aD1I1aGmsGhvWIIIoJq68fsscDHIYa0RRsM89II2GG99n88T + 42aW4eW46G2WI22YJ0H1891ZC9G011WYY21H3oW091Wef9AIWZ9o04402mm0BI2226PH4O0I + 183P0Y9e1QaXD0JYs0COAWK0H2G00IkHKZW40CEtI0IIIJ03RJ008900Ki55WW48ijjXM7nK + 17K3W1WsssiIIIYKRRpM899IgjDRxaa891IW00Ze9jP0000fcacwx39Wcis480X9QIJR0800 + KGRH3a040Wf99JGG0amsqi940100RYa640J2KZysM000W0QGRV000aWDj1H0P0YWac4DGG2W + eqs8a88100Rpaca00009OI90W00445994Qz4fyGGer9W1000C999o1000Yaa8f1022W09DPP + ssQG4WfjRRF0H3Yrcjj961D5BKtoG5cW2ZLot6y0g09OAMEGGJWeikDC0e0GecWlFH491XUX + cDW800Oz@tC2i00GRQF802mIWP8XG81912OmxL80GcGUgVB00811uq@FICa8nRqV2cYIIIer + J0_@@Fqw38999n_@@tbaa4f@@V@LIIaq@@z@19HIoIo0IGgsc643G1BQRpR5f1WHjhjHm6GW + vasMDYmsWXqcefGOmG0Qpqr45OH09AJVq4BeW9jjjWX9eKDjTB1YIM5qsqC9H9a0IJoc80H8 + 2f9RQf52GQfIRJ041WC8DjfXW2m6sss4H3200wRR3jcY8m98qQ60QRRN301SRRRZ0dWGhDef + 54UxvXzSIONG5c0RXNu6h9d3U8eWAPUOU680600KDtFj1C3220WQ0IO2026yrWk488Qj5g08 + X65EOo04ENUa99B9d0Bw5u30100VbImLS54Jm101806MuYa11A4h904G0KNW24500Qss000G + WHEKG914C@01hwHma150400Ozp2kAa0I0005JJmYKISUW1@ThGF1tSNA1W00gw4m02880v4a + 0011m608u9X36d0XgLBuC14sxoWS2E8VI2UgmX95_OW152Ha3G000z6e0I00WiSHOH072WeZ + a0C0W00m3Q8areH3Sj080400G20n9Om2qEqKK1TLmHg38Sp5IRHO0G6G002GID3JGs08GG6G + 9Q06M90YMCG0W0WGS2D4cX10220IyuaR2w8d03GI020G0I2189GVQ4qCG14a0G6@yYGhP8SD + 2k98XS2Ce602o9mYWwWvU03k9@Wqug0200mI26yVH2FpPHI19aBL3hmtm@PS4Ci5z8KG5_7C + Ub18000Mdj0040GrKWH22Dq4G3HWJHobv08080YW4G6060A04OBW5Q8e00200400G_7eXYjN + eHX6QYrWe5CuLF3E4fXEff9vI3_FeWM188ra2c0HX_1E0G00Gv95i5Z2zO4H2B80400vS06Q + xmaGhj001W0G88aeeDuJ034030Y00qufM28W004hJ1v14Hr1F080GOQ78_CAYi6hfWX401Y3 + 80010I00Gwd90G000W18m4p54bG2v0KmM36qjI200aWQ@FX6hDO9W4o9GX8WaX08400000P1 + 90dMem2_6a2I1DPOmiU4qDG2nWpm00GKO31X@eqZ340108IIO2mZ180300Cd02Mlq020A254 + KGE17CmY4G0W0MhqY5Qu87W9_2e2m04000Y3w771K0W7L1OGtx5WW808F46smuWD2AuXY30W + 0CSwZ302446IHYlf6v8WCIFmWvfDe5q3o2eWS7A8Da2wrXXa8SuY08o98Y10w1a800100ePJ + 88o13Eq1X80C0810G38Ayqv1vWWmOEGiV02PXRmSwwSAG3805W6PeWUBCuf32cn0XMBN0100 + 0800eq1MuCAAQJ0dK7cepX202048014umd5AFO1W102p4KGM16K8G1X84oOeq4EX5lVdmno5 + i3p1DbYGfE54am2JuMnO2OS_W1L5C3100WF1COy220A40yd21800G04G2GW0GeI420040aZ3 + 1p4GW010Wu2E8fW5M3PXr3K0104rFIGqLH2hVmmC1UK7W22e0KG040i0k12008oU8XDlOOQ4 + 2IkcWj1MeRY9ELWWZfFefEO230XVDQ0aW0W00WY5O8u5040101yzs1@Du0010YI9IG800G90 + 4K9W27jKGO044Hq1HnEHeEnWAj5a10990GCG5a4W0BB9GW2IYaef03G000Ga81990III0aai + 4iUA14a4K819HPIIIWWaW00MMIDaaa09890GIIYaaa41C99I2IG4Xaa8112aaqj8891HQIIW + baa49199GZIIgJb0IGG2LNtGerZ8A99H24jD8F1002GWaiWa08OHG00K0Wa4DBH9302GY8B1 + 952II2W4a5199n9140999GK0IY4ca48GmYaaaW0909H22IAdW2Y6eWN188qQ2GGGIMEh6XlA + 2891fGhN8332IgfWD6Ie@d2AlGYp1Rud23wvOY9D8eGgQAxf280G0r0G041CW7CMOG_30208 + qHG180002t812G0Wf5aGhD74IW1NOSG3BTaT02t0H2a00ak0K01A0m@I4W4H0K10GGT17GY0 + 0eFWA0Y004MW1nIHGh78Cbr2B6GGHS4C1d851aHE17CGG1L7S0881WJcU8r19sWvY3Tgfl0D + MYaWK4O8pA5U_af512fW052E02a200bKp0820og_FOGJIYFeXz1Q8GoL2dW2iaj58991W0I6 + YWWi0TP1f04IIa4aWe0310GYa9A99H0I2ZWWW00999IIKIWaWa82P8H2I2Y4099oIIIa0aa8 + 819HIIoZic04999kGGKGGI0Y4aaWPG88444I4XXq0A8H48OIII2baa4999PO@F0R2PHG2W04 + ea0989PYIW2e4aa8811HKGGY49BBIIJGW0W481HHHGIIWia0499DAoIIIaaa6GIIoYYmW089 + 912GIGaabiH3GWeaaae1E0111Hb@5GGIIgWW5gFn0G0IGr04HQ04uWaWCu42WaWa5Qj3ZDKG + Iv5C761000W0900W004OgX2013020X0ic120500qRr3440008010A10OS98WYW0i901r_8HQ + 050002uF46wjm0W0W0RkMmi8FGJ3GntsscB514HRRRseM4C5ijPRLInY4scjjNKcX4MkbzfH + oX6xsxIXveXBwPVBo7yXGajcz1CY3kii5B320mEsMjjW1IGIwr__Iebf9KRRxZ3W1OjVRRYc + 410ijbPZd10WOocj7X80GOR_sc0000Ppts60800CRRR34C00ejij9000Cwx1ssss2jEXgh98 + qQ3O78e980Y418qWaCHG0W202cG210Q01OA028011AGOGi3G1028k00WeO20Yb104041G3nG + GCaI41nG28IoWW09P20e507f1D10G0c4YG4Ks61YbfD0b0aGW0oc10WYK4PRsGR9I2WDPRGa + 091iz9Q3qqs6H2II0QORB0H99YiijQaaa2jc08999ojjjPcaa8XsscjGIYa4RxQ0A0IGIZ83 + I3W98e08eV0U048eKW4eK0Xa4M31c000kWQ0aK0G1q20J0I040O80W112a0E40aWWWW2cbb4 + 480oIWmGRcG41HGG0G3336q1XW10X0G8PB2W191cqiP0qa49ubcD02Qa0P8q6f11I2QZss2H + GI28BRR19999abjjnaaa8__scHJJIerAOXaa4vsscjJIoGh9ewQ2G02OOacqcB8488JQRadG + 08eBDHQ3J00Wa4fjH000iKCD50GW00r4cM01G00BVIgG4000DfD01WWePjDPR120c4ccDv90 + GI02qWm00918HQJBH0C0WAOIIY0K08CDDHYI000sc490100GIIWa2000WI4aa00000GIIIIS + s54QT1b_KGer70Yaa4v00GG04e10087424RP3pIG20XXf5R810IJcsa9qW81R8pcMIY40Bd6 + l12XWeO2FV60oGW8k9l1G0910mEVFW4WQmUMoNZ0mosG4W0W80VcH7o2cCW94G681GW0_2_V + G5II0ON@701191Qs@F0Waa2Sx@5GIMY0@@t@GoYaazP@@89IIY@z@@W889Xt@@@WaaaaGhJm + laa4f@@V@NIIaa@@h1W0aLm04iasSj0GnY4RZqseDPGH9RRJWC1ayCjDjAjPW1Rjf9HYKGCY + sm8vQZW2@Ince0bGAfDGJW5I0IDQJJHaa11A9j914YW2skd6HG2A6IRRb2J10mGJpsGW01Gi + 9JRJW808WefjXXW04YsssY040WGhLG0200qkssu48WcssIer9CZn1XMtG4bEi223Zm4HX04q + 5DKhj1ILPFSlw5n4CnQ0JKKG2r6SGP1c4uq5r0KH90BSoe1DdgmTGNaGaCrmsGDGLaBO1v_K + mWK408001042G0nR49G4H5SmjC5iab530ipx06aMw1rbUmmV7ybW1GW0001a0Sce1prIm_W5 + S3W1dWMmO170G80eVXB6ujYIbA15000200WS2OOaB2W800C5m30I08YT5XS2K8cX3w7eWS2o + 8S2S65W0GG0030O0A0000080ZpcmX4IW004ePX3ESOXu8GeX24U3GYCA4fnWFQLhWJQD8X37 + o7VX7p8uY03M2mWCuD8jXB2X7Y10YH200GVm5W000yJ03G80IW0040440GGf60110O5M2g68 + 18001000109005__1XcMGIq9CaW1@CQJE1NKeQ1tRd0980Wd78G004G614m0008dW42ikWS2 + meWG2o9WZWwweP0260O2W200XQ4nZ168I00u4Y8oERYfFGeU4F2dO690G4p0qGyQ4ac015NM + GnS5Smu11GxGpq84G040A006nGcQ0k0100W001WU1F0W0G0888WM0A8fE3Y78XP28Or122LW + WL08eJW7_0OXoyLu2182jccRGCuwY2YPu04W00L_V0000aA8OOP23EhqWGE9000bGD3KCF@C + 9YSX000ePnH8TR20281b201BmS0W0mWoHR0H00Gr1GiA16V3iGKi6qu87v4OXW00mESA84w3 + 0202Kv030202800WSy01W0WW2HmWrcB0a00GGZFip12W000drveUoBOIY2W800qBU2h8qX10 + 0W0rRe02380G0010GOc8V60u1C0040GG0G006COI27CpmG1GiSz1RuxmJz6KIG2hXJGE1GC2 + W1bAoHg3DiV33aa2W000G2JGW000W8eG00G0004080YetWf2EusN3Q7IXlEGOhX22Bu00c20 + 0G0WK000iIG113Kmn17qQq1PO4JE15yBG11DQ08000H000xQUGty54G01N5OWW0GWz0U8dW6 + g8eWnRf8K7SG0014yZ20420K00021800420mAr6C0m106002pXXEmDu3JCA10XNG5PJ1IG08 + 0CAW14000A58X24EeOW6s0eWgNhevV52SAfhe8080OmuCBqU02XuJGdJBq6a40220_LJf51e + 0402nieMqK32J5SGV97yqW4xX9HT04qgm2fQLG_zVy@s5400e20hWe2AOja3eW04Sd_10880 + AGn0X008ZXPGR_5y2G1r4emjJ8KDb1X0KmwE9iL@10G002FnXK3O8x7D0e00Y0G010A00004 + 0H10004C0_LfWaa8OXY4_a0YihEed82cclWAnAe7W2_lXWHpHO4X8csHZK7e0100W800mLa8 + uRt22yfWi0cuD59ctXWr28uTl2w2mWDFA0120GS0DKbo1v7J3G6IGbaqCGO19HG02Yi4a412 + 1822mIXWba0PGMaaa58f91f6w2mIG2W4iW4911hI0IGWa10IYGIaWWW8HH9IIIMYWa448998 + 2o2Gaab44aA1G9P9hX_0A999G2II4aaa8P98H6aaKQq88P999Lr78H995QT4fgI0G622a440 + GP99GGH2Weaa00298I2m2bW5W09L6a4c48191HIGIWaaa41809GIII0aibA990H3Wa0gA992 + 2Iwcd0a019912IGWaa44B1592GG289995III2s4a41919IM2Ia0aaPRRGfs80WaaCqwF2VjX + I5K0200m78Ra0c3XKHm6GMKJF1HJKGJGH4QzCzIOGJ5IiB2113K0280W31Gu284g1e0W220N + 0WmKR646M6G1002E2aCCg0Wa0muLBC1W102G4M3GYZ2A8A032lb00100t0O0016mjCKuNN32 + k4fS28W000u41DauM4T3yG6l5q5m2FYKGD15aJG1pD5Kf2P4H039XlGqTN4w36XzZJB0Im40 + 0eb14MAX0200G0008ZKnW_9KuW55ktEdk7q8uaAWaab899HI226WWa5CB0LPK02G4aWa9B98 + HYiX99198I2QIa4WaO99vHY2G24a4093f9I6I2jVKW1199MMGIaaaX8J98522388f9hXcWGh + LWia4KA_HK3G1HJhGY8NW4a209119qI221aW48R99LaIIYqWa4HP90IIa9PB91oIIG4Wa489 + 991KGM2aaW419P9II0I4099GGIMYb0a4BB8PIIoIaj4W8H11HI2IW4a4Gq04O9939Q02O999 + HII0Y4a44P999o6I2v4a0YIIoQ0E8dWB8a4a4SY2bAK011WWwXA0801Oa4604G080n308800 + Y448mcDUpt0008Wr0emza7K3m1lVIHD0FawW2r0e04aW400400IW24006009u12006004K19 + 004004g1m02MG0r0411810000G4aW0g1W0qW0002001IG2CqQ1r0OGQ09K3m5f1C1188Wcx9 + 0980GRG4a6G3r0aHQ0K4QW20009m2200400CqW6I3GXQ0k8DW9IGO2BJ6OosM@CEi81ARRpN + mGehejT9ROPaA_sijSGoK1osjbFCJ2OOsss68lDuHBRVHssW0XjjDRwh7FdacABYQbjppgbK + 8WO8plx_UC991ZSR@FC124fVFRpaa24WjjTxqW244owij00145RpMM00008Rsss0000Wx_EX + lZLe6030jjjPB00e602O0000osscTK4WC0I2XW11cmO90024OB0109IW658a3444548Xama0 + i02Wm610BZG0026WT0G6008A00W18440009JKKK880IiWe90I2I10M0200Gg0241YKQPs4WH + HI08PJ120990YeXXKi448smoYP2oo41_1BQRGttD41U2r0e0rssMTIIIa08e0m0811na49mW + 085524s036044HGA380IGGB0_WI8BA08XPIWi9126WG9aOW822hcK80aqGWoqW00Wm0G8AB0 + 2GI0045cgf809104iD0003RB28811saDOWaW05wEciGIGq4VBsc99PI0Rtzz28nsscAO1RRR + RE9991jjjPdaa4fsssK1BWWW0mfhb8L0G0Wssa4b01PGRJms0008P8DJQa4C8HDGQ311a04h + DD912G00csKS1WD1GQRIq209GWQBpsY049PW9JR3044CIaii1G0I0Iq60Y000054ca09000O + JIW24400if8Q2200WqaCD50000b899182y4Waaa41U3peIWaaaqW0C8qQ289990MM@64K858 + RBIN00Ie8jy0g0830us6bKr081HQ1rEWA1OGaI_00mWaGP2U3G0Y209WwA0091WfYbMB1WkX + W4OC80Wzxo589120cIAFW2Wj1Mz@_mYXa4WM@@0GIM4otVV08A11od@h0aW01@@l@Xa499@@ + HWZ0IIIo8mLe603y999L301C9991@@@xZaa49fe8JfjDI3GI0CXsiDTB34mGZsaM1O12EQRR + g0IAOHVIIIi410mBfDR6sGXmcqePA30GGwpsKOZGmIYac48H22WIRJ6iD5DYDfj5mIY4daaM + DWW208_cij40046Rpsc442809JRQ0044XiDDDqzD4ORRRZJWWklDe6W4O700K301A000Y0@W + s@buI89210a10eehe360mdFNC0A80m4QIqrC2t0eG2kKiFb2300LVCB4Cg1nXoG705KKm230 + yM3E8SVx1p8OG4U584008BF3E2eWe0E0G000W0080GI000G0GC200G1085J20000YcWWeNC5 + 6T0XxaBus0TA5W001310A886AWW_9C0GK000004G202R0G0I02WtL98O62AEsW@28uRW4Qjx + Wt5G04W0G@PASb8GZ2RmW34aJG1T_I0400eC4A8d050080W004PFm32HeWB4M0280mfO8010 + W8le2Y0teLoF8Ks6MZcWzBEO@u20040Sda12G000800SR84FNVmA05q501HrUm4m8auBFW80 + 06pw1104030Kmo07anT1f4QGstLypr5Xtvn00aCJ012204sQu0W0080C800209yhg1B_MmR1 + 403008B02QeWWEdH8QA7oTsW6qY8u3Vw_c01H02d2e0012WS2GeM02o9mWW0EuMX4I2tWp4S + 8L@5o9eYO@ef603g30YT18eW02_8WW22OehK3_69Xe7AueN6osUYFr99d0A0KG04YW15iS08 + 60W1080XG00001B00W02Y00kkc04W4Wx1ZG714iI02HYeW044Wl4I0a40mB1Ai701T5em0dM + Kgm5nDKG36AKKW18400AS8X1CW8B050600iP38fNiIPDL0q0008C0IHv6KH01W044oj6Xm9I + 000emR164S32XXO0140We1eOhW3_IuWoMHeYSGo9W24600fkIGwo6yAW1D0O0a08W@Z9uKW2 + sBnWnqpe4W5QbpWNHe833P0830CsO1r1K0W4000Y20dgLmRwCiRP1dulma07010C8J13cdz0 + 90W09z0nm9zm0W0yM02WW40aL020108g0m0I100VzZHn4F0Y408@t6oY6eo1G0GWYmpu4GA0 + 48p1229jWaE8Ot28kd0X94G8Tp2oe5100W02800gWmWHi9O6ZPI4f20G08W040E9eWhQ802s + 4IQE40m6WOU02e400G000IW00GD040eG08TW2sRd0011Wn9m0a00WWaLO0W8s3jW10i9J240 + 104180GW4W0GeXAaEG1lQVm5V44s04T7Sm246KGG67BUGsFpygP1XwKGG09GG2WOhQ460u08 + 2007MpmX874SG3j9OG304yCnFHW3nX574Bl10WI0wG8Xe1MuC32Y28Xe3cOVbTYJuYI18024 + 0uX37SXW17FSmH9M43W2vuxmvG_aJG50500ISIXI9A0m0WGY1Lqfa1B20nJgQK3m2DlR3200 + GW006fOamg340200wfa60810ySj1bgRGZ158000f3030W80Cc0288A06aXWj2UO525YXfZ10 + mW03GGl18800O0a00210004022tXHGXwBSDm3BTTmZ2AGW00e405U3vWNOu8707g2m21501R + URmd580130OR038G0080000201GkHFaOG13ZrG_HLyD04Xw43OJqGjaa4GBH3b02IWi8a4H2 + 11I0WGeabW48H0i4a589931G22W4aa4OP19GI024aCa4dT1IGoIYbb0HMGIabaa0B98JIIZe + Fx2a081L3G12II2qqaa0199fKR8Yo51IM2Ir0mG4uO8PA8GQ1Ycmji1818KoIIo80W408BnH + M20W41G8III0a4448918HIIWYba001988oQIGv4O0IIQ3W444A8991IImY4a40DH99IIGY22 + I0IIIGttCK3m1X6KGD05e99B9sS2Y0Va@5E83E4010WyqW1vqGGR9O4qm2TCyGT3KiFX1999 + JtOEypH2jWXmD1AiKp1NHbGB68050WuWY2G000D_F2F40HBBw8001010Wqe04yG22x3Kmiu4 + Kda1fOHGi15Kol1HriG6144vd18880UlfXlaIOmcJYJe28080d4KGk14CqR1fRW0400W@3K8 + dW9_ipWZEG8d036POYTTyfxX48020yz26bAOmYVBqm8GH4Po6D4K3W18090s2WXwjI8D952t + XXD9cOqH2YoaXK7_v642Waa809380I2260aeCA9110oGIabaa8n2IY4aa49199GmGIaacj89 + 98HGG2Q142OI20O9899443qaaa899D1GIIYWiaK9991IWWag0X0WWaq9YO0GGIo6JEeXx22E + PXwJY82yA444a098HH0MIWaWWC19PPKII04aba8B9CHYbaKq05899PGIIIYfWa48099T2G08 + 991aiaaH3OGuk44Dm1lVN0489f22y8d0NQQW0X0015B6Hv6EqSw4X1mGqxrawW8s6enXjjc9 + QAmIsssZjeDO8GRxw_Y4SDjjPTxWbS1b7RTRQKk0mijkTW8m1YwspceDP05RxPM8He27RPrM + OoegWiLBRG3mcYMljz0QRIYrs_sOC0OGVssc9f0O0RRRo8X400qjPR1ARdN2S3004QjC8W54 + W0WvGXq2WGI0440G1I2114G5X1I4a025403OIi0290e1i00WX4Go2s07IK2020hY01EY083G + 00h1Za40HXX0ue4a406I4468hhI0aGeIjDDm4aW04s660IIM09IBBI889YfejQ64aQh_WGhT + H209g1K22010Cm51598a0Y16Y0W8GWY0HQ0m2GaWb2K0c0H2v60A0IWW8KB8W18Y40a9KmY8 + WcY07rc4CWW0qm096449GJ1e02H1401fWb0e1G9RO2091128jQX4c492IcjHGIq4BAsq8XG2 + 2R7QzC0081TUJPJ14Y0e9fCR1GGKqt4a501H2KtZYK1420Kfco40W91WQIPA4aW0WbfCH020 + 0WcM6f0G2aeqcCz0X022JpsqW08829GRV00404iDbD8060GX999G00G0ccaC10000BJYcW44 + 009T@w54QTCijLC01820soCa5a410QB7ZB0pO8iiWO68GK2uHn_32H4I49K_3W92HmJE_084 + X4GONl6GXG4KFPG02GW0iCHH18002KkbXX4B00ScolW0WAWWtvd7Eaa41QxFFGGIWm@zzFG8 + HGGno@Fa09Bv@Ghd1OJIXQRJQW8fXAej9HtIq8Cqq6TL334qQNccOB2M0QacrY8G2OKJJR3D + X90CDDj2Ys2Wacag1G4cebbkf1RR24GIqy6498ACPRQWYDiK49jD5e001Yfjj9bc00msq6DP + 102GQRc60502eDRhsXGhNPWl5Y@mbO@KebvhYtYWtbDeO0i6A8eW4_0GW0m506abm11N3780 + 0WOyMG010G1194@o4blsGaq4Sx02BSGGNC91G01AM032Lh084Wa0I00MQyWI9KO2024400W0 + 000202mN04ylA1LMJG2MDqfW3v4yGyrBq0UA20G4winW92Cm0I200G00O100fNu080001100 + 13GGJM4008881J2G00CS8f7R4yGE1R4Yu59NMGE0Ciyv1X1kHA0Aq3G3DKiJMZPiQG5j3Wmf + m7aQM3Z0GmA0CC8r6fSnZ4404a0W0zcO0i40WB08W4W0W00WWhtFegW6IIsWa3OeeW4oKhYh + Zj8dWL4090m001eN02Wa00SKU1v4WGVT7aGm10100kymWS2MeOO9AtcYGh1wWX60800yA01W + 200QZPYfHKOqCDYIaZm9I1290G4@AqaQ1V2GGCu5azD2fEu0040WQkde71CY0Fb10gW224Gy + j4Sqt1N4a0K00WO08O2X7EJmWS2AOw0AIG_WDCk8dWOcQmWf1MuIW401G0a60131HmF3J4DH + 3DFWG9FxST054WG04080eGA08W03E2W01208fYOmRD4aQu5ZsamIt4CNG1G000IKqWc1Ieg0 + 82jU680WYH2aWG004800W02I00Wa001000mI0GE1A4dG2T4Wms06q101t0G0500avBU8d05k + JnXPHM190WGQ0AW080ut03o1vXmBD8W14QQi01001R7GGo27Sx12x3v4W0028G00lFiWG000 + 400KJCW1200WoV8830429WY73KO7ZA2KV5G2M0tDK0X40X81804O008988c200VCNmV25iI4 + 102048801CL13n3G0e02WQfJ0G00GG0DCdmG01IG4W44adk1N7K0010IC4aWJHSGE19800GW + W04m86BCZP2v4OqZBMCAG10110khuWH688IX20202CPn1H0GGB17CrR1vhinzbGTA02dMhGk + gBil43FDGKS2iqLX180W000W1S402W100cl6ZXCWO4W3QB8ZIdI9d0A0200TF2404e0gB9Xi + lVvY030b00C6c931y14m0010W00202cyLXq9804W0H708KQW10180QMJXOOMO765G080aI01 + 2400c2WX10A0300GeEqKEB10402W0400802OL5204W00400uj434022abG301106001GA00b + Sa0W40mYz89gZPQ1WW408e242I6WXJ7CeMW50K00qHq180WW0011ykY413JWa00WxwB8V2M2 + rv242a4A685XII3YW0r0PB8ZWK2GW48XO1BDLIYa899PPur2GG2IYa44CLr20919HIII1889 + H0q5020IYaaiC994ef08erL4KIIo2acaCA024aaaKdA3WiaaIL5ZGhl091992G2Ge4aW8e18 + HsIYACX4080Q9Mo004a81I2oI44aW8999G0IIY4Wa401190GIJArkWV18e6W2aWaaOP9910H + IIRr44_g3zmMGuhSmaWaCqwGQmWWKyFOO13410041s1nlImF8MKX41HUmG8y5KuUEfES1W20 + WSZ8Otz4cOgWA0A04W00004W8rK8UD2wUdWarD8d27MFZW1czvJdAIXY08G60xT4HPE8W002 + 8xz3EM921080Nbym1YwiTZ6RKp0800WKhDep74ggEYH1qudnXI4fYlSSAQAOYJmYsc88zj2Y + NfWqAM8h06k30X0CMOqX5g2WWYRUeN36o907401b8088X0OGMu112m0Iea4W00B1HMG2e49F + 1IGIIW4aa8119GGIoYWbW4189e5G884a7iqaa0989hA498198b8I120III_lWQ0EWW4aKerg + 83B9G2oYY4aaG919P2oIGeaaaO8B9HKGIY49Bf22MGMIM2iWa4189954qG_A4O9991IIJIq0 + 841G1XMdKGO4qL21zZq0400ot6CejIOsm8dK7e0aomWijjD323GTIJ03JHIqsssC5jDPPRRp + kBUWK9FjJ6a2jKijQR1Y0F0yod_51RO2esss7NoInG_w_5PxXPO9Pt6mbbxub7BDIIoXm@jb + D5h10IcajD9c00OVos6e100mxVRJir00WqlDR00G1ajjQR00W1msgbD08qQ5ilD04QT64XXW + 04a6876IWG0G8GIJ8a00188f1H0aW0X005O923RO36X8iG04WC0I2s2WoM203AmtH508EW1g + 4800G18a51080GW1HOGJ804424Wi5a0CRZ3f89aGijHmga40mss20III0mQR3Q099ORRQ399 + 1HijDCZaaC9qsMXMNYWaG6t4mWWG205J3IZM81G20X1QI04fC6408m6CWFX0W81YW0fWK624 + OW8Ge2104D9118XeK1De00351g0as8ana058SG6K1WWW009EM880G3COss42II20uRp2099I + m8DR3GW89A1ijH2qMD1Ohaa09qsgi5IAqw3OIijPQZa419iTerQ019kHJRg0K064DzjjG00Q + aaqc8011LKIJYK980IM3Bm6W0800fPQQO0W0Gca588280Iacs2G024eMKyW881B2QRJqWWa0 + ZibHR0OW0W0YjDGW00eMj99000000saa01000P1IYW4100j89nMGGer8GQI00W0WKer7WW40 + 8qwCSRP13GG12i5D1BX100Kss0mc40fOPn0SIWa48F_R1G1DWCG7Q3P022Oyl_52IGB0YaC7 + aW0mHiuC3059Oe2W2820W4uCiW92WG0WTga9OJ00XCw@F0089ozx@Uk1a8nm@xV4qYaGKf@V + 0AIIo@_pV83j_098n@_xVI2j_0oIo@XMd162cGasct4AORmOQRoC1e5GiDDpha20XrtijLWW + 90aA9950MqKecrq43RJ2GJoQ504iOeDTHAW59HAf933I0aAWaeXD3ZW3Odcc09IHf8JRJAIZ + 10KQIRJ8500WDfDR6c00mcsiDG200GIrMj2W0msifD00G0Opsq600G0eGhL9Rc6sO4XAOMeL + QwC000qIP4Zuim504isS3fHd6809W4cC0G08GCKjq5W351G0G2GW6YQgrr202GGaJj3rfHmE + q64Qr1a00WwiBYmXaetb6wO0X10oPB12GXIW0180Cg942drW_fD8R028000MHJ1D4K0200WR + 4CuBE22A8XqXKW000QXJF19200002GE14y06120KGA8eW6lAu_p3a000iH02v4Sm3o6KOG1F + 5iGWjA49PHv2G020m0000090GGQ3584008cP8MnJ40X045HGGO6tCG97F7aGy14CXG1v4SHN + 7ACst488002UGXCF824e0Gyh6G0a48TW20H0000098g02060000004I000W0044W40@XM080 + 0Wo9Beo13gAlWWaEeVu460G9H024X2G0I4GWS2GOa02wyjWO9DeoS3o9eXSF8OFW2O000aJW + 39_gGGT1jAG10X000800CSe2nXPm@05Ctm2DQhHA0DqO6AT4uGE1N8480Cb04UV3120X0HIQ + mH1FqIH2n9GGR04a5p2nXYmF2PK_NC8G00g1WWerE8GT2G200Koh4PR1Hd080X00vJa2sB0X + 1K9uM1Cw8a60100bAKGbn9a6m42000Vv8Yi0AuLW8ETWY6n69r1A080480W080c2WO0004G0 + 40088W20000a4W060IxL14000zcLGr1MCR31b0KmPY6yl01V4CHF2Ii402POa1YG2mt88W00 + 0ow15iI5178J060WY84CuHT3W00801008XKAW4W04CG102004H00CnG1C00Ws4faG50vRW30 + AG0yK610100C10000409E02AZ4Xo1COd656m0XO0Cu314W410S1017gQo00cW80GAr12Y7wW + boB020emE070C008tW4UEnWG9MOIn40140quW19wimKTmii06PLI0W00uL4B02I0pO44Gm00 + 8sY5O00ayjp1VwbmGB4SFo1V4hG4F5CJm1VZmmVDu0400G40IGJe6aJG1Z4Kmbi6SFq2j8uG + E1DKfW2z9ZGE1DazpF8004c9m0100KHgVmC39S_Z37wNmS16iF04JJeG854Sda3xIbp515KB + W1JMqnYFk4d0H2020cJeWL8Keu12k28Yh1CenX3gCRg0EheZS3gJ1X_1EW000qh2BSHW6xrM + msJBC2wBRU0otB44CW1lpNm2H5810844000818WcDEeEY6cKg09000b5e0212WrJE86c3MGe + Xz0E8CJEg1uYGk8e@B2sdj04001TMJmiE982W0uT028u0048W28008w4OYf5C0820m8094ej + 6RMmY00006040DEOmH290200ysW8YMd00202T0OGfD6q9Y11wWGR1Ha8G3vI53G42G50a4G0 + 0XG02IYeia58A91J2o2DWba81n20bab0P90IIGI0Waa40189DeI090B92II6N0GWa4449911 + oII2gXc0HIIKW4a48999W0aa4P999GMIosgl8qQN0W22W4Wa0Y5882JGMa1ni0H00GOGMgbi + 0209MYia40989OIGI2W4aa09091IGIYWaaE9999GWac8P99GGGIYc6a49999RI2Iaaae2js0 + Wqaa29B9p9W01199OJII2VDeFQ8ul73g1xWUIOOsg5saG1G0G0HfOHjN4aBH6XX9pbQ50402 + uaW2G2W04U42T1GGPP9C0m3tOjmu0Eq105NoKm00r8900G000qbW70I0G202008010W0G00P + 00g90XP4DOPR3o0eWN4Te0c5s09Z_vk8g3FUY@WiJG0I000AW0aD1AeY86wPmWw1OOa04g1W + 111G074KHHux8W00ej05EEeYNaEeO0TIhncn1AW242m709CVq2FLZGO1I080GOp0EkzRcp0e + 099O9II0I8W4W0819HsIYm4XW091P9MoGI0aA8sAII4Wa04Sl1II1JWaa480P9fz34gytW@F + 8WcaW69998QII24aa4ECn0WaWaldG0baaaES9W4aaKY8B4Qj1RNNGerY89A99iV28119HGoM + YiWe491986oGMaaa4HoMGYcai4819P997019PBd05mIIIcl21IIMIoAf1baaavhGWaaa8999 + 9MJII2EXemmAOb47Y2XWyPR8d_7oaCZuXi9r1ACijE0RRBp4WcAjjjDP90A0WssyjD012RRp + stjB2cBBtUouSd1ZODRhGi6b4zirF1p2Q8txsyGAmqJ_spdnfGI0vhssW5PU5bQDT1zWW4hi + jjXW00GEr4G100cbjj19100qsss4D100OVRp600G0PRht60080ijQR30080qgji500O0esss + cGhr0C04D400H9MaK02IIC0B1HI0W12Ai13Z42800003HWX8QG0WX0c85s12WY0GEo00101G + 8Gf062P0H09XWY0C0O8a4aX084Wmm8941GKW848B2Gmss00II4PPRp0P9H2ijTEr4G8ejLpa + a49ijDOZaa89ssCiHIYW4QBqQ2iaORpq69H2IORerP094CmC048WK4Gva4484G2W6HJGc49H + 0289J190pOH4G32meSO5000DW0Y24G44G12nAA80R0GG71e2H02Y1A1H04oIYaW4Oa81WW0q + q60WaaWaijDrsaa0cssiGHIY42RRgW20ss61GIImssucII2pGhHGxRZqK194Qj7IRJ4WaWWA + DBj5300YcsMM1W00WIINfA01GYQP3sWW408i5JR10440MifW102G2mIsM2GIY05qGs41011O + PQpa0W40eT5B30Ga4msCj18000rg99X1000eqaaa8g8ejQ3e8994QT1l5MGer8ma000009PD + 054Qz5ifiWX8X0HsIo256a402RRNA20A0i9PU791Y2e3_C2W06GIHCj2021Gq7Uj18We1ScV + 0dW408mfba6Mm824l127GG0GuanGb0822Sc32d004mWj@@7GWa4Xx@VFGGIaej@Rhc0Wz@@U + 8A9Rhs0B9@@k@HI2jc0_JIIW4_@T@39L3m1XMNX2c64bscq612IGOxRZlfaL1ufDIl2GeXtt + uvHsW88bffB5G4KYWdqc4PJGAuIRQ4bf4H9D9L3e09PhfD22m6eBecijD8XaMOoca4DB008J + RRB8900KIQRJ4500W9jDRc0WSg9G060GRr50G0gLRJBGer4yVH1XMl2850WbPUPpdI608e92 + IuVa2YbBYwJC8idTYXBey1G8eW2IIfXQ0Ce61EYP4c10IPUS2Q6410H80LqYmuB5W190G001 + 00X0a73E8L12O0G2yHW24Wa02oaWdSF0320my29aPm63Gi2900Xl1A0G80m8140H01AH69cU + WXLeTuWA2UXZWq7Q8QT8cLW70P0052KGUf401018ml9snOXngZ0148mwxV4_wDzDO0A80Wl3 + AWYG0GpV90E0082W2_1tWV1CGG02GNM90GG2OrS5YQuWm2EG100mt0Aa_X9dFfH228GG40eU + G3MeuWq3e8M16YDWWe5Uuph4ITueh_EuqG42FiWgqJes05218XkC8G0000110WD7Eu103810 + 0yt1K2004_BkWS2QO_L2IDqXS2QOFt2I2rWS2U8D052J6ZWwK9cv2oeZW47A0O04Gd0O0HW0 + uW03QROX4Cc87b9o9WZTgG8WJCwR8XB1C8pg4s4n09002PIa0aW4mXR80H00GD04O810OF04 + 02G0W0W0uLK2A8G1a000d5J0a00WKC09qQCIAOYWQ2fb36QeYWV1I8I15ELTY0EZ1400X04G + W4H88K25E0f0G010HVMGKvD4Fi1j7wGF0702009gG4IL59000KPOGmM48W0008X14IpR2G80 + 0vzIGEiAS3m1DqmGE1HqEG2XM7JM28081400K020W004000NCtG@0CSsm1X5jGdg9iEV1x7K + naURqCo7800CW004av02GW40MGcWvzFusz3Ut1XH2IevK20W0WEOIDf1m2200ZB7CWWG0Gk6 + 5W041wGW6UFe1201GW000AvWWB58O783IyLB0C000118BHW00A02d3K0G00W0EB8bJ2WC000 + 004Ob_3cYsWI8SuF930O00K4W1NtGW800WshK2880PI75SFn1T3GGE164Z12v48nh29aJm11 + ZmmK7s4d05T3y0O0X00C021Jhnz9QK301XDFLR144rE3N4Hm215y9X2j3K1410WO3K8qV9Y0 + teGhDuF15Yo_Y01Iejh2ot0YS2awZh2kPmX_zAOod7ICnWreE00002400W6nEOM14s50XFuO + w0X5UAeW_688h@280W0800GeOY66pWWS08GW04GU1CW0G4e5e3odtWhuBeD7IYXPXn0guLW2 + c5gWb9Ee202W20000a002WWKCwU0G00xLW54004SbH4lQmmhiC4QTA0102k10XoNAuV04GG0 + 0yB02frS0WG0WFYFukX74000K0q198qGoPVaBr78990KMMY0baW40899oM0I49aa8808H2MI + ga4P9xq24IIIWWWa59891IGJIW4ibO899Ho2a819AHIo2Yaaa8B999KQIG0i4a0A92J2I224 + 899IMGIrfYWbaaawK9GaaaKertq3B12J0Kaa4089e9p2GG4Xaa00819WGIIo9W054Wa0911_ + qk0JI22aaa0H9B91G2I08899QIIomNBWW4i49918IGQKaii0o9m04Waav4e0WaaamNx18e0G + Y8AiQT2rHKGG35iYK1xCSGt36qq428010cvu101005I5JOORiYq140WWc6G10Y0GjJemV08q + L01T4OGCpECqo2@ISHqZu08119eW40W204T820e004G004Wo4VNv0G00022a0th4H_n71811 + Pg648042aJ01z6Im2_8G200Q18560mY9uGuB9bY_uXf3cPsod2gxY89G0a0GGxC8aJZ1XTbG + 51GyV12zalH809yR31XMZZqab4919I06n2WW0W90eSWIGIYWaaCGX98Ia0c0999HIG2g6V2G + IG2W4aa41193sIIoGGMex42aW44K3014aaa899CK5Y2d_JGQqK4Qj19YO2IGI4aa0aGBP8LG + 2GY8aW42A15G2GGaXbaC9HII3e00aWWT2G00a4488992IMsaaabq9W1W4aao9eWe1Au052QC + P4M2IIXM@I8Y90400090Wq55FSTY1LrHmWgTbw05CGYqmyjjPAQ03ts_cdYY5QWBRssc0XSb + j9Rzt72Pa5hxP25asmazjDO2E4W_UMdCbB90VBRsO00IAT@rsmW8QcjLh9m0faaJbijC0042 + rsU@OKG0GMtscHD000TRRsWC000ziPRXA000pMRrB4QT1jLNmRl64Qz6Wi41X14a0naMW00I + 0CO984IH1GG1bO144O130G9038O5AKe80Hk4000mGI20YwY0QG061G5H0RRa0B9014DH1XW0 + KU4c411MC1m0sMI0GIo0WYcs6eGGY8IBR6389I0WjPBWb89HmcjD6YcamsDeBGijjTRrAGij + jLZaaKerRW1B9n8WA1Wa04yW044CQIa4W2XmC9LG1CD209CgAN0GGG0C3b8Aj80XWHNEG6W0 + 1HOIC00IrGr4Wa22WaGP1AU09IG0kkf8W8991gDR2Wa4000iiDXWaa0Hsti0OIY45RpsC89I + 2ZDQRWW89XjPRRbqMT1XMNmK1C4Qj68800CBQJ3X0G0f91DP3200Kqs8D001GKJpqI452IKh + KM6410fGQAQJ00aaWbXjGG220WWqKDG000iY08f00G22JYKsW0990CwJN00a4WC9ba0G00Gf + 899G0G00Yac811000hJYaW0000iPer7GI008iw2gkMXGhxmyij92A01YY_qcma5GWBJpKL0W + 40j7Rz11GW81kZO0G44IYV3O48A0XyEIR0X1e05ZJymQG0az@ZCWocaWvBeA09I4WxrIeC80 + 11sVQl0a491qzz@Weaa8L_zxXI2Y4p@l@129I2Z_y@9WQhU1FIIIjLJ0IIIIm@@@XMxXmG22 + bsys41GA5ORVZC1a48ef9RA22eedceDH6051refV52mW4aaqt6PH22OIJJ598W8ejfHA8890 + BjDRB2W05msi992004Ooas650II9RRJBI300KJRRJ80000DjDRY200WcsiDI140GQtMj3XMR + 0R30WghD8qQGQkFaCXkvYdEsCRa8l8uO64G0G2yR23800GQ98Zt1aOYWVc84bkB98fNBQMea + 10QAP03oXwW8D8OZi7I8eYs2WepeHQbvbu89W8090081XtyA0K22008018118x6hGw08asG3 + rgL0G0GWw2K8EP2kLBbo4IH060000Wax0FOBg2W4CWKIG102W0o9GZ@h98d03odiW01C8d02 + 4000yk3CfBOHl04SHR1jCTmoS74W025a9nT3PKKrCv4CoE08qT01DIGW202WW4Mud05sEyYK + 7GetzfU9eW_39u@Y6G000aaa1tbMmtC5CB22nMS0100WtQPW040mztAK101fYCa09004000v + 4Gmy65aJm2@eIGE1GyEW1bEMGE1FKNd2v4OHGTp0WW00G40GO3AS8G1LOOmIbCb3QEXIeGf4 + AW000G840GX0NiTM1n8umH574xtD9mfHaiAKHB2f10HA08KXm1r0KGE14yAG47VOGMBK4QzC + TFK0802We0UOgz7_lNXmESO9K5Uw8YmJK8r1T4W0WK302L3G022403201760HB15icm14040 + A8kW9IQOcM22u4XcHL8d06omO6100bluhGd8AiHG1bIamJ340G00S306M7e0e201fFSmR284 + Xy1@W2p_ELCWG3J2SGXs6825000e0mG190A01eS24YoL14200dOmG1574DCIxoRGE190G08G + 010G@c6C4f39Tk0W040014074yGUwB41W19uiGCpxC3G1L4GmdA4KZW111W0m00WK2IO5W28 + 100i401TSM0002WhAA0181mw29KIG1@OQGU26rsV3@KxG17G4uH3020G6X0YH0K8dWMoTdZf + SEW0G000W1Wc7QOg06m000y322Rv81W0WWE2rY00Wn5qTa6j2h0KGK64y4MIl6KHLm54vg21 + hemZ5IaJW2f8nnLIsaHR6JHeGhM5qJG20103_sYX79avqfWwHWXCBBW000Of56820GO6Z3Ud + W0e800pAKmWN4ClZ1vL0nmELKGmBHSq0420Wy4AeNj3Wa000W04uOX601000J00emk4c0uW_ + _8OE0204004Om1lnbGV8paw05@7OmdrBi403jv0n_044HW1L7uGk29W200ukV4oFU84WW489 + 19X00GgWaa4P9904KI6a44W29A9HIYe891Bo0G20aaW09999IMYI04aW88D91IIGY489HQMI + Ia4aW0119XMIIYeaW49818GMIo44a40IIIgjWa4889vbq489999DQ2C9991III8qQQGGIIK3 + 01OGw2aaaW991PXIIIXWWi4O998IabWw2W0WaW4RkIW0be4O198T2G009f1aaeaXlIWWaW09 + 891IIMGWa4a889BHI22Qq04a6G1jkY1G2GomNRPE82MJHat6AOjT5oTlXw6C9wP3ITW5W200 + 5gS140001011t4am509SHm6nAvmAB2zoS18G00csmW4BOOYi9EU@00G049Yamnq40804ulZ4 + URIZu4Y8Un5gRmY518W008GAJ50280xOZ5o98ZA1e8d0860WaS2OeNaDg5O1208G7_jH@1Ea + Km1BaZJS2Vyuj1j7WHwCBG0008g15g4OXB088eA6YAOb@3O8@uAaKWa899HG2IMWaaWCD998 + 4III4iia8399HYCb4D1feIIIWbq058990oGMIrG71P91fsF80D999IGWaQ0Q0aaWKqq4aYVE + B1GWaW4590O0I2IcaaW4GB99HmoI2Waa49o4GT1G00III4caa899Bx4e0WIMIT2SWma0aE18 + W4aa4P919IGI0H3KW089f22a8d0T2am060040004IMG1P0000104Ao7X70Cek2281004E129 + JCKu4WOPh40ssQc1S05HRTRsYcY10jjhR3WnaosZjjJVckJM_ja9PZS2psQsWPc11w9xVI6c + b0ijtPZcY8hijLB3YYq8sIz@050IRQrs_280I3KVBfZeW10PRRRcg010iibP3Q0ejw2a000w + jlj9qQQGH89108JGcX4DXcb20002i5G0e6A930k9I00Ga50cPGWL0G812C0RC0WC44WjW0HG + 40C006YWWc800GHQ88282DB0W8C9W0W810Gej44paQhWfCjD0aW41YMsCoIMa02BpM8CHIY8 + DRR6WsgH8qQNaaKsOG0W4OA0YS2G3WA9X0Y550Iwm88n40e5W28ig2W5104So4LW0a8G6868 + 28eW8W86W1WI88AHI11HIv_aa8a410HKTI02qa0uXMJ8HGI2Go7scGHGIW2hRM099HY0jPR6 + a69XG6jDAIWamsXMF300I2dcMsI9180QARYM0040jj5H2220GroejHmiW4bAfj102I2ecMs4 + 1001OPJ95cG40efXK30041AD9IBI2a5mseiC00I6HZss4408093IR10800w6Y0080GQIJI00 + 00Wff9H0300WY5aGhh1DjcC88G4IItmiW8Y8mQwuM104bWyCIo0230Ybe2OeG20YAu6S08G0 + 1SoST014900pLy02d0aoQ0WGGY4WqU4KW0YWWrz0848001n@IS0i405iwy@JwJW_x@HW4a4U + x@@122I2Sw@t3APPerr0441KDj9j1Ws04sqqiB9Pa0oJZsAC0BHj9RID003298IInK7908j9 + lXMYc2cac6HAJA2QUJq2A20oQRpd0002Ai9RP264PCsCjd1W0G7osca20W00zqss4Q000OQJ + pceX00ej9RZ6WGhFwy72YMhYwvAP9WAwz3eFqOOGe861uWWTmumVjUAGbrjFu1XE2a4fdcKe + dCA0400Cbm1W200QcYWR729M1BwZvdUMD8dw3A6814Y2095OmzQAqkf1D5G0WW0G0448r3KG + k290410uncdc6rW4VFO5F2Q18XijL8dW80200WG02g6q208C0ia075HGmWZcq4W6r0OmN4G4 + _L4p88L8Yiq2W2010080005dG1d4Sm366KBS130S6500WY4AOvD30208CUB1xKJGM17id011 + EGm579qds5p7amA6Gq4i1hXe3300WS2Ie913o9eWK1G8d068W80KNU7fPMGE1L4QDDTFq0G0 + 1Wc9M9HX6_5OYDF983ZTW001iFm2r4uGw9HK3m532Wme844I12Rn8HerqiLS6@2Omo0FqNW1 + fEO1104W8@D8RRa60W0KG0074aGIfBa603@DK0440WG4aeMaYgVm2W40092ImkV40400esd6 + oZ6XE7EOrX5QB01OG009PWmyqEiMG3X6OG66pyGG1JEW0012040G0H4KG1o5W0048EWB0200 + aLm1n94nXrxajH4h9KmpR7yH01G0W0AIGYn1kG000Kr2CafH3RF44G40WQ4KOoa26VbWo1A8 + GX2gOmXY2We_I56SEXI2K8d0Mg69ZMoB0W0GGk05i0m10100W000aHm1f0GGr0608G0wJW6c + IeWOoDOC68weQZ1TN1W44G_h6qZG4LE4HkKGaJW1NWAKS2LW002W080Gly8WH008@u5U7eWQ + MYuHW4c0W0600016a04G0W_cSgiX2cw1YlFkOc3C2E9hQ0cuy42Esg44080VZTnlQmaJW6DE + OGjx6KFJ130C1e00WyMoOpih0C80ivG201WW00H00GG0ez02ACZWDhL85X3ke0XGhDuYW4QX + WWw3E8888cEGXGTc18G00090W318G100Ig8BC4p100004200Koq4jhWm9RA4D039DiW00WWK + 7mH019GPj7W00O8wX6sZeWi1AO_844000G008OneAoodWjQy8KdOGoIYeiaW021f12IIIWb4 + aOG911IKIm0ea499IYa4i49P9OOGG2aaaWO91902IIY0iW49HP9ImW48899Ho0IYb1a4H899 + II3IDeI02MIIib092IIIaCaW8999G2IIITg6qjg1XMN3IMG6a4a4G999o9m08eaa88A8H26I + Yq49GI2IYaK4C9811GIIIeaaM0899H0MIY44a49GIQH3O0FB892YGI1SNWWaaGB1992Wsa8P + f9HIOIgW04Wiaa4Qj3XlwINNSqm04fDeGD06i_G1rmiGXKuKGG6d1Smi55yy31BINGG58KRs + 11TO080W020085ZmGFn64GW6T9H424001000L2OG_0AS8@3lEPm809O0009@4AYhvcw6sm00 + 4GC18q4W3h3o0400WF08exx4o9GXbtc8DW2wj980202j58nmHaKF02010829OXv4i9K7H044 + 0y505DMSHwFCbJ050PfQAyW08891IIIYa4C4H991LGIIaiaW09UIIabXaQ@W04baa89A9n2G + M60T1caa4GI2G62212I2222eWGGE0IIII1r64sV1l0OGA_H4QjB6mMIaaae0919GIIocaa18 + A9982IIoabW48nIIgYQ2otl0ooIMaa5a89B1aJj3aWWaZ6W12oM6C999HIGI2aaW419PPD04 + 0B999u4V00084QT190Gmj2ICrX2G00WACoYSAIeFW2E4mWHkW9r1AGZWH09xRn04K4fljDRH + QFcY@MilTX0G9Ppss18RIgVss@a0RCZvBTBurmu1ajj417m20M_py1RmuMsspk1FGI2Bhts0 + 4SI1jQjP1Kiq2wjij1qG0WijjDJS000UssiXb0aJD1ag100eRR7QTD4a4aWv4GBpKK4G0B2G + I08020G201b835X8D8i8U53q0208oMe0G8A8o0XJYWDWO2bSCX15eG4aGBn0680oI0mG16IG + eHaEY13IO487001ORR889924ijPWba8XKMcj0GIer4enIIAqwQqAWmuaIYa4IGWOrQGa2C58 + 30480sq0eLa0D12601825C4OeKX6Ka0a8H6A7GOHW85Y9511e2O4ZCH1e00eYX89468jnIHg + 8I60aOWQI31GI002cscQPGI0ABRM0C9HY4jPR0Y691HcjD0nsgB8qwOG20GusMsc2108GHQQ + q244e9mjPPGI0aiccD923008GDj480G025qos81081RUJhGaW01j1iA04WOHff8R02W00q6C + j10G20wcIs008111JJQ8PP2qaa000004RIIYG0008DD922000Kaa4QTDciFb10G00Uqq05rW + W1sHOAu600H0cP1D80GIQMosI7GWK0lt92O1200qd23W040GeFA70s0eSudI62Y8myy3M71m + G0ykn6b08M0yq356C4aomrt@70Wa4vx@VF5GIa0f@zF98GIGtt@FeKRrB4QzA0QB3HMIw2CW + X13jhDxaGK9msiej00r0KQpqUJmKsGgqqK02HBWIJQJ8XC80hBDHGa42Xds4jW4c0Xsc8i0A + YO2posiW4IAZDQIQWC00WiDjjei8009fjDnI000cqsi1O800RQos810009TerzS_u3X7vpJq + C1400freB0400iNt2lgAokV@qw37p2mmW24CeY4ltKHE1Q1W00AUW5ISwWuDB0000vH34081 + 0OJ32m801q@W2d1O020WaK0802W0mB150900ODl701G0ajTG408000284Z8181G0MExW@eP0 + 488m558O100e8X5a080qXj1NJiGK05a3H2W010EbS70200C0001008yWC18102_5W0G009v4 + qGJo9SeG1t4KGks5q101hRRGzL@i515HuP0282WW0Ae3l3_Dk00GIIH1i0a04W018OXW2890 + 8j8t2ngVG305y_d2f5GGqkCK768ZRinoW7q4m17CGmM04C6W17IvGJ06qTT1300s314yqG18 + 4W0glrWX0U8Cw4IZuWUERee0AobWY83ifjQ3G000aJ02THmmCl4aJ04H3OGnA9qEG42G40US + ZYGhlf6W3oDO21G0WzlqHF07y0W1h6SGCCtaJ05n2K0400WVYR8UH2craW1B8G900m856q70 + 120I0I3e00102NLeGN06C9G1W040oQycYJqG810G3NMi0G1b_RGN14qRm1VWkmO8LC_12Vuk + o00N8200upw50080G8008D09cvl0180GT20ICzQqzG71din1054s11hBsGh4Di1K3H3iGggF + ar8Jh0S0W40W80C0e00mb0AqxR1BRqGy5BqWy10900wB8X@1M8qNYW0W8KE0302GW_0mW9NG + 8j03gbkWe0Gu604WW02CgX3FBumuycaJG70600UIrXiDg8dW4c9mWM4c020001W0WWXVAQW3 + 01000610eFd3YS510208p2XG5dCSwX3b40nk1BScOFn2OGR18O0008dW3_FvX10KeZ83AEkZ + S2e93ZD_4O14220JbgGXGSy_n5RXjqp08yg22@7iGB24SZ11XOjGGwJqgW29GHmwHa4QTFJW + O1400eZ62fEaSkC0agb9eA76IZWYTBaP5EUW2G0SQX2t3KmBj4C102P4Smm0ACH117dLGQ79 + a302hlEHsF_qPD14W02As8XA0G02A0HWJ6aGW1jtRGBN5Si62j5GGK7FG090OeX7on8bTvg0 + 804m_J4a3G1P4OGAS8SZn10200FAuW4uI0884GsG4y2G11mTmPC9i4G1XXPG34F4gJCe899K + III2f5Y01D99o02IbeeW81O9HYqIYa09pJIIYWb401B90I2II44aa09B9H0qGYaWW49GIIf1 + G0GI024qai8899H0Io6aQ222oIgJL1MI2IaaaW81995QzD8899GIII2jba40099oIIIbeaa0 + 9O9Ho60Ya0XpIIM2Wa04jA81p4G00919IIIGiJaa00994_Q20819HIII6UD1H3GWf99X4388 + dW680915QzIG020IgeXp9I8s2PcvvXmmevH04I_1YF2IOvT2ABWWOkC8cP5k1WWn1S8jiBUz + BdcCGORU3_hmWHX8uO060H00CRW1X2Ums0OqVY3d1KGC1dy8p8ZESG024aJm2A1W0QFpXn1C + Pm9X60W06000HVZGzBMiuNOH6SnqFAabo2zIImL15yd02xIXGm95yxfDv403IIJIW4aaGD99 + HG2IYiia4H29PX75K521sIIIaWaW0PB9Os328888HII2Ziaa49891aa4a819931112G2Iaaa + WC9PBL5Y4A1993jk798P9f1W0ooIGafaa898810MGYW49XMIIWaW401R91Z1OGd04GMIIYqe + 4Gq0B0I3IAQW3Gs2IMG044i4a2jM80u0030qWG2GWB6C0828Is3BiZ35dDemHf_aw05c0@cW + zbiPuJ10sosdj0293GB@ssaoO8jlPPx20jvbDRRP0cfFnircK83RGZsssd05R96RlTV8D3mB + RBroeD2KcsKRfO34GaMzjlG63OaPtsVOWGGGsotcP0800vxRsG6C00jlOR9V4G0Ncij1YsgD + G000CPRRZGhLmRRRJerQ0m2008w40C0896H0f2Wa00Bsb0W5m04H12g2GI1008M0AO1G029e + sy0118001W1WW000qWD030XPGGW1HG0YjKcMaiH0cs30GIIW03hAKB813OPQQ0G112iDiPiW + W81c6cjOGaaa3Ass02UQ2Jrss8GIIY5RRR4B99XGhFH9OHZHG0HWD9ao1i0H8o381c4YCPm2 + M4B1aa200mYObI421A9BGO0G0W5e048aXW4I2aa202W4qK9bW49W97DN0GYW0D5MK0GG22Y2 + Qm00C50DPOPYD191ECkPXoWa9MKdj10Ia40uqq00H22B7Qj1kjj52jE1nqssC2II2jc385nj + GxJL40aWgj5D5I20YsMoE100fWAJRbA00GYUJps20499eD9R1G4W0sijb10I2IoMII20G00r + ccq0911m8PJo64002eD8I3I001GYCD48100be1910022iWma40010O2QI4HW008FD9qQ4400 + 0e9999qQ509994Qj60k0X1G1012iUY50058AjNKA0a04OD1H62102CLI02020069sWY0G2Ga + 2ag00001Ohj630b49KozE402bWKsfh1I0I04i@lZ0O91iwqdZ854CWbll7aWb4f@dFFmoGae + vpzF8BGIWaZlF4489vzsgDW@@@8GIIYGhLmIIIIerQ09154jD9D1Go40casiR2QH4QQYrY5K + GO9DJRiDQ3APQIJ0i898w999n6qY6q_a61PIQ4QQoq0P00ZQRoc29CG089QJ0G80KsijbHYq + G5cqqm01Y00bass4GG00GIRZc0100ij9R3q011mqej50QhE1fjjDjLRW010WGhBfGBBErPXv + vQQsFLYLA3GG00Rl5IeFS4Q0HTu1nHEmiId83ET3W08mA0EW810m0058G20O514A1eWnNOO@ + bC2HoeEjw03004810020G0FASG616CZW1022WQ2WWowYe3Kc2lOY2uCeW0309G0km51v4GHJ + 050G088fW22R8YZI8u2BGYeQc1PB0G00IJJ504098If76xYXBhNOK09c1JdS2gejr3Qab0W0 + 0GzfZGw1L4dG1hJPme0K4d05NTqpN34yHB2t3c00200I020PAOGgw4C603I2W0I7eZG3S8tz + V0G04qJW10300YF0XS2EOMI2W000Spy130OWr00WKYDOwWBQ@0XS2a8qwT2FOaY6y0100mVz + 4ivWDfgQHM25C5X3bOGWG00Wg3Ae6a4E2eX44qeIB3oDmX_Bl9EO6w10ZlGa8Wp6g_0Xx3C8 + II5Y5uW_0IecpRG101yxd2ZCeGPU6aW01W801w80YG3QO1P5AJeWVEa9S2C654X17808GGma + 1A4QW2R3aGssXiO01J3OH66pCAn14G022G0XI08GI00Gh84qD12J8iGZ08SD06pFSmmEPbrh + 35dcG7A7arR3t3zqf2Ie020u614G1124AH318Sm@644w01prImG04Kgz4L9iGEkoCfC6f3Om + 5260100QO05W00WaQ32X5amA14430170G0100WV48e524UGnYROy9zJ3o90Xz3u8dW7kRuWS + 2W8xda_NWYetH8ACyY8eXs2A0200G03RC27111enX11zw160112cr01e0007M1nBeXbJm6hE + i00X0W10e0a00GzMgS801J3mGc8yKQ5112K080GWECY8X64clsWrDMO9aAkq1XY3Y010WmkM + 8K6ZEH0Gm@05C2m1XEmmaT4iW02PMNm604W000P703ENmWtVNOwaNIIoY@08050GGg5KqRs1 + 00W0Y1eW35K0G10G39F880001081000Xq0IOoW4cO0XGTYPtK2aaae8119GII2ca440A9992 + G2G4baa8J2IYWaa49118GIGI1fI0GGIIaD0Wh0GW409X8M9me99PD04O9991MIIIMq5KGD1j + Lp01919IIIGqajb8B99eaaaCqwOO22Iga4q4A9f922IIabaK8H89HIGQN301Iaaaw4e0989X + T2q098914aa48899Z6m04iaa8189Brk0GII2jkcGLb4a601acaW89RBHI20Oc032jM6W101z + CfGnNT0400G0000400WQ0C8j3AAawctY_01000400YJ1g0241GlF9iNW2pMlmQHAypY4ZwaJ + O16qMm10440MXSbh3G8VW9_vmac0O8EXB2at0000820GGM2WWMojuA8EAZHia1A0O00m00@S + Lm4f8EIm9MalL1D2qGs264yG23iuGR5Ui2X4XMl3GGMo2FMW4ae4989e2FAGY4aKx7646218 + 919JZs0qaaa090Ig2n09391IIIIabaaK3D8LNFHerc8O99nMIYYaaa89P8PIIIIefaWO891H + MIIME14q901IGI265m0898902MIw4G10aiav4W0199We1KG2I2Ya4aWS2Q8ex22j_61G00JH + W0G0WWk8qOfk3cTbgK7eW0asakjjDJQFeqsMsar1W03ORps6M41fiTRVlqG0ikPvRJ06cOsl + jjWIG6RmsNs4RCjG8PRp79fWmvxho2a40iilUR3NeW4Kgil7bnGGeoos630I2osssC3Wx38R + BH6m0GEr4G2W44mjzlR0X00abjQR0m00msYjD0000GlssM0100WQVRR2jM3G6W40Q10X00BX + W02n0Wa419c68i22W0QGW200Wa401kq0g66G0GO070821maXFG04050900909CP0qWOL20iD + G1Wq02Gm422E2I0PO8mGL11GP1I38faGWj103r4BAqqIa52QXaSP0Y691GGOfqs6P2IIiQOR + Z8H99ejijDqQ2ejjD2aaa8qQD06a4Oca068GJhSA124ci82389OHoC8WXO2femYyC8481b00 + Ca20mm600H60I3I8WDC01955088GzI11GIuW0RC468X0RdX0Ga64eeww21GIQHsU1cGJIIWR + ZbM898GYXHgQ6a49Xw28CGI2Ym_WjjIaaaGposMGIII2JVRR8e99YbfjPa4a4Qz60108CRQJ + ILWY4ejDDNJI8mqqciD800OKRnKK8HI24hqoM000010QQR0W00Wj5jLG22WWst6b0024eYme + f80100BJaaW4101DR3AG444Wiffj00aWGffD900GI0casC908H0IIpa84000f99H0400GfII + I0A3a0JI2000042js0IGI2XMhXAJJO4G0I081bG10C02GpaXY0400HNsX3WWgm9HRc4X010p + JpAeMG009Ljf00AW004boH2042zEkk1b111nc_c04ea41A_k900M4YCUE10110u@0n1118Hw + _0m3a408SU1pJI2W4yUr@31XaI_M_@3HRr5uHIGgjQ2GMII2U@@t39BPerRe1b0Lhjj9XM00 + 0caseJ2An0QRZyAa5RuD9RwC822BlQQJW85b8gDD9ns4o6qyc6H03JKIINr23Q0mQRpq0iC0 + 2i9RRY0W8CcCfj3Y00Ioqqc0H0a0rqss40GG0GRJY68812ejDR30Gj1msuf50800rejj50G0 + 0esqs6G000ORQR3cbWGhLvpb6AGMXCQMevbA6rvhmQ1fg93YnnXorgeCEhC004qWI3H4gmu0 + GK4m1v4CMd0DW000ywG2UJw0X20WDEG0600W07OuTf4UK0XFVw8D6XMThWG4C04000G00WH0 + 8W0G40400niQ8OO02UI0XI2Au1P3Q9mYG5Q8I1X2rHXt1EW002m504G0408Id2sFWXS2KeCX + 9QcqWS2cfU9Do8bWnhIOW3F8110ar18F3IJBKSSmX299iGzt6KCn1pHqGZ4TaJ03X7SGX04K + 0hC4000RYm040W0TCiGM19Kez1W00GYvO210W0XJyn00@8G00uq02o9OYOcF8d06gT7YS2Ye + YL22gJ902003Wlm6xba405n1qn96XaJW5W800U5e20200XOPG22nKgG6T203408WovBOe036 + fzW70804200040WqDYuuw465e1W008f3wJC0Myef1h4K0420ac5OG050Gz2GKiG4G000UDjW + V1SOEV6ICuX4HU9nN308484cG1T1imh07yrU2RvVG2nBSpX4PDI51G0Yo6EOAY8G200yYl10 + i00U5PXF1I0400Gy05CU15lcUGK2OCln7m000A7mW11Uuj94W0G0ywV3tEKGek7CfQ2f8anK + 07C_1B7lqGg36G080OcW5U1tWvXGG080Gcr7SAm2vH8niFx4QT5ToI0IW0WQ180800m404aS + Y1L8GGRUBS3W1G000e001K4Q1jMOHB074GX1W000sIXa@R_ejW2o9WWH28G000HJ3Hq1W240 + W0oy1bS2O93ZAgYkWF7EeI06kt0Xe6Wef0204W04tiQ7acmT27CEq3N44oG04W0028RBR2xl + ZQ08eh34sE2ZE1U8I2W2uqaJ6m86W2YvmW92C0401Gd5tK96EG000YkqWXNWG01000Y0Wf7Q + upS5_R0XgOH8pPAYXPZM2WO32C010800280050uN8CKim12100EtyWTV9e2030500yt@1b1W + Gf7JKqG3LhLIg3K01009SY2kFmWP180402m13SCME2zMrn@3L4gJC88BPLGIo25a401999sI + sIWeaa8889HmMIYaEHnIGIW4a4418B0IIIICCaa0e99HKMIWa4W490IIfdI0GAIcWKL0GIII + Gg60JIIgEr48198rMT3oIIG2jk5a45i8819WIIGYWaW6H9R90K2Ga0aav4G00HH9IMGGa4aa + 8h19H2I6cac04899ANJI30a440IBIyJD12I62aa4a89CD9Q060P99LG03aWaWC999HIIM8yL + 709985_AAnCLmb3H8002OhXCg1mW_fA89Y7gRGZeFq8rXB88000800eOW4M3v00202h0K088 + 104400z0O0228W7hZOUY4g8fY_29ez4VG2000128OL73GG000400eR0DoFX1G00040000Y0W + qY06n4WGouAaPMClHPma05W022uC0EUAhYS2I01C0G4050I20eEW5kDJZFkHvW05IJe01004 + haG1102W2_N9TGa2jsXL0Gum44glY0G002V0K02W0Wr0We416QFfX_ELuV5H2xl29P88IIIK + Bym01199KIIG4aabKu11O999R@u01999KMOIgld0IIIICaa4GJIIM301QQI2U3mWGG8WbaaK + 884K6I19YaWIGIIa4aa8D99hylWef98qQNaaba898H1IIIWa4aC19814II24aa18B19HYia4 + 9199s2IGf1G0MM6oE18G0GIIM960IIMgW03E9W0aXaa838BosE2baaaA19PnIGI2aaiCqwTW + 010i4K6lgkGZK@KLH7fEGXMJaK99PR2WW2aj@jPBI21Wy@djFTFPRR9sskTO6oPnMs2W1E9C + RBx3cK0aelzjDGJAwms_cCMJ6WQtMiFDB2HOBrs6P01HmKxR9306mGzjjD002baljbPG0Ocn + __d4G19AHPR_MGnz9Xb9vV4001qDRRR2001mijbD40000sssc40000RR@GhtW4aa4ihd4x22 + I4Q0Ga00AH200GP8081m0B800W0O001map2b80omC02WmI00AIA01GO0eW1X00ImcOWiI208 + O30C090I4CbqYWa5msKc0J0I0sMIWGII703B50809a45C0AXXI09M608HM8X0qgDjHYaW4es + Ms0IIM2ORRRH999HijjLZaaKerRujDDr0B100GW4nKmo448G4090mMibHIY11081DIJQ42JI + 04ye88Cn1XW8_2GKW4G106IoH8401GhXWHY40D9sI09QGIgkAN0C19H2Xi5WWW6W1Ls45aWa + a260aGH9Z4F35c8DD0XvHa044000iPBRX8991cjzjeaaaaF2CGijDD3aaWGht0998eRRRRAW + 000fajPBG0GmI2cj0910WQRyq8e0AnQrsq28811IJR2300a4ieXj0200aysme5202WHca908 + 800ORqaca818aHBI30000a19D10Wa0A8jjxZW05bjDG2GGWcqY80111HQQR7K54QD1W0ma8D + 90000OAqQ389194Qj6aWii00008svqcb81W4sqRqfaE0820PI60GGGCG6I148G8Mi6JXW187 + adU31eW1G8IN300mG0iIh_Z4IXi8Umx60GG2Ogq@411A1G_c@6Wb4autJY4i400v_VQFYY02 + uo9K919WIuw0mB440QvV@xFb899nz@xFWa4am@@@FGIIIW@@@U89P3jU30044A9fj1qqIYny + a5TRI9smQRaK0189g9PRY58188HJQ3498eGDDfDom4WmqqsAGRAYGpRgKIJ0WGIRqM4480XD + vQRa280X4jz98a02GsscMW44GKTD16MM2bcei08g23JQQZ01992DDhQ900Qhc0Y0000ejDPJ + 0000qscj10040QxGh@83642HqYsGl8srZgHUbSXCuU4BIzvW_TIuP84_5mWLum0808GMZxK4 + W152OmZ1LCem5RAXGUcUaJm7Tjy1818Wd2O05I00000Ga404v0G001002200F4n0080XQ080 + 1200W0000904xvgG8L5yHG1X2GG9160GG2ONW2sTwW538evEMIQuWKQQOP02ERu0224400We + 0120W000gLX2040aKwG2bCWG7TRG000G00WGU2wW008Ox85c561X000f0aWWW0WccJ8dW668 + uWS28eVB86yYXS2696YAI5e0K2GG0W100200W200eIT2g5W02GG231K0W1000008p9Gm855q + Uc2LJsm516GG22OIX5ggVX3_EOD04cMGYS2ee9W7cuqWJfXO406040iKXX3j3vnMOb4fH6W0 + 0004080009uMD20200DTG12202Ux02i000J6emS87C@m1fjfm00D140WG00042G0WS2Iu5W2 + 448400008hH3I7u0a000v4eGD06aKF1xEiGK05auxIG0004008qX12TlyGE17K0t4H30HSF4 + KG07f18H94FaXH5bbLmH35SbG152mGt04yC919wLmqR7a7X2h9S0GO0WLRH8U126paXFJAuB + 04s7OYh1IeK1C0204aiS5RSGGpr44gf6vlhGS0AqXm2VxiIE1N0G0Gex12_EWWtKbG2000G0 + 1WM4AG402Gd0HC602p5imwh8Cp15XX5300bWS288ha4wP6Xm1AuXZ3W0088280OPW640W0yF + 01NzCH11Li2G1r00nf0AaXn540G2QOG14044RgMm2I4K7G1V2a0800me0Cu60241004B02x1 + WGov5iFW3t9iGxf44aqC040e_A221440d3WmT37040Iuhq3c1W010013EdmF9USFSGl2LG70 + 90H808X042RFXmQ98dW3G81Wq202XnqGcbLCRx2N94IqIM0G0G0100OS04W4GG01G8G@5408 + 10m000mII6KXZ29KG0W44egyR0844Gv0Da1m171amjZ_4l41N2O0I00040W078G0W40W@AC8 + dW6Ioe022G0v4qmY4MSrU7n9aIA4GyaB1W00067gWwAy8MT4gmuWj0Y08G0mD05C8_1tNY32 + 00eQ1WOR03gBuXvjfO@N52uKAO000GW40I28XiDDOZW8c7eYMhNAd0BAJWXK2AuX04g7eW5h + jfpW8ILOd2fAu102MRmX8oOOk03040W0100ec63kEWWl3Ie9W4gkMZGTYPg23G00W100G080 + KGN750G08wQx2I38XY1O0W0G0001WSBQe8b3o7sXoVFOtB2kmWaK7g0404040awdQG0400mr + 1ESY51dzYGr1Fa4Z1t7ummxAqqH1d1qGkKne4q4K91914G224aia8BB3LY2IYW0C49mPeII4 + 4PB10I0IGaWW0091P1G62Aaaa4398P0IIIa1C1DcA10A89HmIIYaa4Cyr2OH19PIII8dw28R + 89Kdg1iW5a8f9112IMgRr7ILj0QIIGXM3YIGI0W4qaG998GGII2eiCM9A4802o0aaJW811Iq + jab01C0HJI2Gd04mQI0YWa4489h1GG23H3O0W2GI4WaaPqU0Wie4998854a0198ftQ90B898 + 222oS28G0aaK1140aqaCyLNIvgWC6Ie3Z56whWM0KOfX32FAXGLW9rXOwkeXZ8Iu3C9cku02 + 100d4uG706ajZ1hjSmp0601008DW3QGv740900000gGaWcrCO4Z6kvpWIGa8TW6G20080000 + aG0GHL6yl035kLGCpw0081O7064401iM23Z3Omg28agG2v4amP14W400O802o9uWF7s8LW2A + TX5E000D9qmIP8iNzLXMxokx4C4m199LGaU4aEd2@7mGRI54V05z2CHW274L92v403GoIIba + aaG899AyW09B9RKII04aaq0399HYaW49991I2oIr0G0GII2aoaa8109HoI2q_H1e999pA11I + J2Iaaae21v0P999r0GW998egGE08199MIIpqejfLW28889qO218BP1ncIGYX0a41P88IGaaS + 1CmIIImU04GGIGYaa4099P9IMI2H3SGrr54Dm1D2KGE1AKGG3hTJGnA74QzCr8LmzNTC9K4J + bLGF8K80G08bEKIT84W42VillfPuPOpso_oZqG1eRPP6qcYcijl9@GaOXijLTpJ6_5oNka1f + On3QrspYQP8CMvvV3Hj44PPRR6ad08ibjR3IIpGqtcjb9DWGOVso6lHIQ9ps_67JP94BvP3m + W45ujjb9IG6Zu_NdD30W0osMlD30G08Rrt600O0eLRPB0080OjjiDXMh199GR0E11I944900 + 800GMceq2cCK12GG98IW0810GWH15302108eAo0145Wm2WC400221KUW0G0YiHF2a0H0mc0K + HJ2100AHW50940aC10mi0080111G202G04moE44AO0221bm10C0J2c0A0eLRQ3Ker4OOZb41 + 9mcDi5IaeaOsMs6HIMI4Qj60H00CH22009D0CW104N66C1008DJIWqGAGYG25aY62s664GDO + 2820QWW0aXf00G062W0YWI0ad6Qfa0aXGQIe4IW4ae80m41Q8AW4jT08G99e1bWGX8908YN6 + 1WaZi1oAz48pYq0L4L2i02G0RsmM8I2ImPROB89X9XjjkDcaa4XssrCGII2jU3W000cib1X2 + 02Gaqs6i9112QPQq40008gD9RFW001hLRBB3W44G5bjDIG0IWscoA011G0RP960110KRRs40 + 480nfR3IG020WYjDD82I2HKcs4G0IOgsq6601192RROaW0a80efPR00YW4EW590000e49198 + XMJ01910020Jaqa00010GIQI8qQDyPNVZ4WuZ0fXfA9406Gpo4LA4C8OQxMU0230Ifie2000 + 10UC22WY00W8e7410H0eupT81A82nYYyD0008P2J_BG0WbeAJoBH0120HXs98218H8ZO4080 + 3ooZ94G0Cenv3OMMG00Gz3S82RWI2@jLJWba_Vd@09oIY@zp@W898Xt@p@aa4aaGhrGJPJ2I + QRR2X4CQihfP74480a_a959eImRQac8JMY2Qbaa2PGQ8GQQI2f9D1efjfY6cs8aqae522c0q + q6f118a0OJss6eOROiRQQY0508ajjf5W199Afjj9c24WXca49A12GOIVc459I08fPQB10G0g + jjQ2G10j5Qz1eD20W0GRpqM08qQEY_uX4GCO5f2g1e00200nwqmyF5a329Fefp00rqYu1v3S + m5Z1b_aAH7O0Gm0WM0I0280G5TL08008ov3Y18XX0KuBXdc6WWPMEuTW3MaKXqMWeQk9w8mY + @tCP00FwsaW7jB8G13W01004108xG4U7eWRQUusH4QAW08100@4aGYZ60GW0ejW5419049PF + 0X00O000KVH1Nobmm0841W1pICn447aJ02NXgGCiJ4uKFGW02cfhWO2A8k920000H1008_mK + ItgYK7S9d0C_Xk02000V2ImQ37Sbk1LIem97OSDX41Ekqot7C0m24200BEEXy38OaJ2QE312 + 000rXSGB27aia1rzJKY8N04488kH7o90XCcA8dWAQQ2XS2a8qwb000G8840e6W62SGY_pDOV + n4_n5aCpSQAY9E6WW82U0408G22GC2W1G000EVF11100j2SHf2q48G1G400gimYu0Q8RY4Q1 + G1L00004G00GW04602rvVmJBASsV1v4G3800mk7GeG436M8XZc9Ow48Y0u04002T2WH2X8a4 + H7fEa2IA0WQ0CeFQ4010DKem1TiOmO8Rq302R4Nmq46awm3POu3I00etDAu2w265X0I0GY00 + 0Gw6TXx0O0G01O704it1130G0A00Wc08e4Y3A49AH04G14KW00e08008@hbmZV9KNG1DhRmb + JAK@33V4LGM14SgT2tYJm0049a88W00GGw040G6GO0a5cHmW0f9eS03Aks0G880@EOHT2EKk + m1f5fGKkXa8o5HsN0800WXLEGe00G624y5D1BIS04WPW94FeGW4gHuWLECONX2kpm0004002 + 00Y2lWzrFuG1FIB04Wa008008o98Xx4A8qw3o9uW21U0400m8y5aJG3bP4n137aJm9vhW1W0 + 5YOJG82W3_kb02082p2emia4CFW2DJNmU38i6Z1701Hs0AKtrFXwKW00GWIYCe1YCweXX1RS + 8g69_@1c0Ete77OM3Dg22g0A40GjEQK6g2rLCIwRK90400000a0000G0W0NYGmD190e0Wu@S + 261uWtOGWG00GS2G0400e186QYfWn2Mehb2oMWYTNMeu4C0G24jxs2HTSmP050GY4Op2921m + WdCKOUW2I8WWK2MW0G0ITt6yFG1G0G0YwW602000100JyrWcZT0K00mljGq1W22024Af0YqW + 800WWGQ0A0400CfY7Uj0ZGTk09G133II2ebWa8892HMoGWCbW4119Gff48Ho2YWaa41189I0 + GGNgI0MGIIa4i08999HG2a4QT109H0HKIGYaim4B899M2GIbqaa8912gJrW8MDG2III2s4Kc + A1A91Jaaajagw1abaaILzXGhl0DTfg30G2mdaa0090HMoGYEbW41099IY2IaWAHIImIWaaW8 + 918GG2IY5aa509f526IIa4ca81IIWWWW4919PGI8I0aaC89B8G22204ba4919Xj1A8dW2sWr + Wgh90aaaKssKaJW19nIGuhR4J71bAK01W0WbAS8hH3G8004fI4W80GIY010120dFqG1V7C1n + 4995pWV848Y3B2Nmx44qjb10201k8uWLHU8O072NnYRHsfT02w2aW5BMuQW2kp5Xn1ce6W3E + 9w0WW00j_f0000XS5CW400mX16SRs9X7KHWV8W100uA06gz_Wv3Y86C2o98YVfvAKd2A7WWw + zF8mjcI4GdkNA0W40m_1KK5n4400Wh1uXq6EuoX3kTlcS2m09B91GYI2eWaa8099HKQI25ba + 4909DIyIoSF8WWaa491O8IGGImaai8fB8bx11OB19G22Ye99f1II2caca09819XWG01998II + IIWWa421f022oILNlGDqDqbF2XMVYXW44B99AIII0aWaa981PXoo2Y04W4RB99T2WGss5qO2 + 1v4O0aca49GI2r0G0mIIoe1Y0899PQ05qMD6XM33180WG4FW080GjhAqbw4JFWHu4O9QBOIs + s_c9m7DHR9RsIcqX8jj9RJ00MqsljjRNy1HMyarHDoI2Psx_W1BD3whVF25ktEsjc9J648ii + @LRJO3KS_Mzz0z6JJQHssYB4F34RBhZf9t1PRBvca0Z9ilb97G0Wuqsklan0IeOP__20Qh61 + 0RRRs000QhcWtUD8qwD8GA120081g4C0Xqj2Xm00a02Iu4I9HG8D02A0W0I2GmCN4O02WP53 + 00C004W80eHG0086YK8mGKW9GIm40Hmm0901Y00OG2WQW11W404e4Ce0094544g114M60AIK + D03B12W8HW0aD090508ZjRGNWORRxsgLWORRh699fGhtG2GGYH18O0dD8Y91e0g5W290c01P + AWa4J04WGOGcY84e6We0HG0G1B315aSa8402YJM40600W4XW31I4f01IW100400eG8I8022Z + 2XDH488C008r0Y19080i08WW4452c04GQ2o052GD01130RpssAfjw2iGIIY4RRRgW52jM30W + 00kDfiXGI0Gasccj0080QwRs4W000AbORhW0f8gLOR9Y040GEbeC0GGJmYIMA889H0PBZ640 + 02KEHs4408W0CPOO02aWmcTD980I8GscsIG0I2eaasW011003JJMW00WWff8RG00aWs4iu0G + er4GI008iw2cYbWsgB0GIIIerRmbmt40a80v9PQK2030efDOZ800GnwdfT4900WO7eE0O0Ge + nSbD84f8G_qW8WY44mgG4GI0212zlfJ8I1HIdagBC4OOGA6mO004cWuBnU002W0PF8UGI2mW + rNjn0311aWtNBWW820HRDp0GEeW@Rh61FIIIjLJ0IIIIm@@@U8993jU3a9i4gfDD9W0KYnkq + aT1RXIONRqM0j89hjPRhCG2H9HJIA4f9i0f9P9oWc4Wqas8IH2YGIJgS0ROWKJQsKeXGHZjP + RJMa81m6fj9Go0oIysaKq6Wagqsa6OAOA6RRQa45jAZDjHIWce8bccfD0GRrByV11ORRRZJW + WsgD8qQDcRhZGGJuoOYYbMhVdCOUkCc1uXZQIezQWMH01G000tgHG416Kf91p24nzABCaJ4D + 2OGMB4CvhIp6IGEIAC003G2001600SFKAD2KmYTHKyhFz1e0G00fXfQGG00qqa70020e3X2_ + fZWea9ui1644W1aIX3VByGF1uioL1F8a0a00fV4Qe8r2o9GXFEBuXW5_Mu01H8GxgNGfe5aV + G5z44I8YX4vJ418iGE0FKAX1T0IGv4DSZh21LnK9v8090485W5YJmWe0O0K00GA0H4GR2j0W + mX09KFYFn2GG6Y40G02OJW2_G4XsGKOEX40O02qEG2BDSGS2CKLV17TaGor498028QD2o98X + T1OG400Ga3EarG4v4mIYlpq9C18000EfpWH9Suf4Lw3fX52YOVgHE2WZRDhG800Gh5NaW06F + ikGQMHa6TCRJR0480W52CeZ332JWYz2SeJW5_kmWV0GejU3Q2m14G00v4WJf2HqBB25XOmS0 + Jqd@1d4GmAX5CoG4H_MmZOji5G50YW0WW0KSlu1d3WGM7B4SA3v9eGD07G010e94AQruW76E + eH04omOcqIFeEw2_bG140209qxm9q8i7o2FiMGhr7C801F5OGN08ynA1RKR0WW0Xi6rfDX20 + C01yb01vGRGa174eG19IMGq34akS1d8KmDo4082GeVW2080GaG01W0800200S0W1bjO0IW0W + 13C0GG0m00rSXG14e004W10yRn3Jby080WWS0E0C00ml29G0080WG0GMH4S2G1W00W6LWWS2 + 808W00840ea0E8V2HcDA3a000VIIm914yl01T4GGkO4ach2GGW0EUu00G103DW0GG0WT49W8 + 02LGA5CrT101m029W02000800GsbkWbO2wG43UjOYS2A86050400020mO0878000LGG1G80G + kjEXzrLOh3KYwmYCHMuOKHItaWAH9eiW5050W4IV6TGOGAXwy021xPtmsACqmI21nyW00OWJ + 2Oe4HXA4mYBNHegwLUcYW9@ReM062UrcS2euO0302G0q5W4D5ume2746G10184sKGY9KGO0Z + 3omWWRkV2W000800YE1EGY00mi3A0YG0Ob55s6O11004b9iG5MG43n2Xw4pw04CYZ104G0oW + vW708u0X2Uj@020G0@3GGbl6C2m1VemGBABW00IOPu6AnAXz409S2Bsxb040900400Z7u08W + 409ES0400Xj7Ueub7AUmWtYUuP0263pbGhnG2GMYaa4198B1IJ2oC4WCH988nGoIgiaa01Y2 + 24iaa89810I22w0L2G0IIYaW44R999IIW41B99I2IGaea48BB9H22I0aa4C18992III2jcWq + e9GIGImKg4mIIGYWa44899fAODeJ02ILrYGhl09909IIII8W4i0899Gq222DXa4109BIoI2a + a8BGGQ2aa4mqmD1aaca0j98HII3Yakd41900WaCaA99810oQYW4XiiM2WWaW889jfXx2accb + aJ01WWWa899DnGIGYmW4qI1581IIoaaaKuhnKgm1pceGC4TirW17sGmJ07qy027OVGyG4C0n + 29GmGOOqq6022G00082000000Q00mL08W000uec3gkW0WS00f1imp49CG030200I8u010000 + 400Q0mWIMs9sF5kUhWBOe8Fc22r0X1kIeeU5MHGXT0C8iW5gPXWca29E1BIMvXe3KeTW3A7o + Wt48uj13QRoWxSc8AlAa000C1_Ej5emv040410e85LkiKfG45P2S7YIe0G002TGQ1W00W4hx + eB02QEPbS2e0PP9PY84Kun1af4b899HHwIsYaW4Oer60aa4ikM2aka40938GGmIIx75eB999 + 4a2GOI2sJ21GIII4jaaK3G1T2KGL85S621819912GIgaaaCDQRGMMGYaai4A98PD05GsIK2a + a451AOBIIIYB2K0R390JIGIaaaax4e018B9I2IoA8e01998H3S08B1fS2CWCaCGE1BGsIIAD + 02KIGIE101oWaa2jc6Y0003cPmnR5CQH1jMWGn440900ywY7c0uWQR98w17_K3daopWGKaaR + PPOKKGqijjjGM2IYVstdfbj9BRRRs9IlK5B9LNmq3Caj5VR8YqeaU@zyCIYQ3r_osG7I3INs + sc91f36RRBMumW0DyjPRP2pW4sczzH8r0Ktajj9GG91psssG8801OVRRoYW4CijjRhMXGhNX + aaa4uXi8vW2o40H14I0G348gGH9Wmnd50I022ximY92832WG9OW80804a0710W0021E00G0f + 0Ya4K0m0m0OAmg0OAO02X850e8C0K4W01i8O3a809126i5GIY403csKAGOI29A0H0050Gerq + 85fem9098W0a4mmooW5P2400QWWC5HIg5402CFPCP9IC008a01210im22m000GK0Q032OAJ9 + 0u8YZeQ2a2T8wGC9AII8WPDG0990Y6e2W40424akLnWWa46MbaGR206BAGo85DI2K8910cuD + Wj3jU6W244k5jjf0000acsMj810G2P3K4a200BjPJhW819hLRBB0W40GvjeDIG02m2oo2018 + GmRPhM011G4RJaKW041WDPRQIW4Wm09DD0G0GIccY0G2G08acc408900RIJq0040Xf8Rhs0s + s00XMF3hQPP0K08W9jjPD80GWBcd7U1iH10Ia4H0040B0KJ00080H3TQ02W20Ktvu0Q224Ei + g0101007N6790491gRKd0GGW2m1v31JIG067zp088ABsynlH988HyQoc3W441Q@OM2YIa4if + nV3D18G_FqwPGKYYYbsqq0J9X6NIIc9X8OYTvPRHKYWeqajjI0X9X699DOmaK6qcsa0IQ33R + RJYeWDCAf99QfX90Q9fRRGWY05yc9DHJ420Issse0G3ARRRRGH10WIJRRWi098CfjPImW00q + qazHGAI6QQcq20XM3q9DSSzp2FG7Ki8ganp3@3GmTE5qLI3XzPmsW9imd611GmhQ6D0W1l6I + mbF8GG00wjjL8100ieW4xiOmSu5DO52a000Yw110J02d3GmlQ4aaG12800_0u00GIG59PmjI + 4080082h3I1WW1zQuMX6UAu68040TCXmDT541014040obiWs1AOPW5sGaWi0GO4E365rWWAa + 080ImpT6C00GW080EF8XY3K8d038W00iGG1n9KGE1AaV91zEA1210WX0I8d022S2fV9QuL03 + 02G1U301xRRW4800100808I0Uw81020GlcQ0802YWhA8vo2sAeWTkD080emdX64NA9TF6oQ8 + CaNM1v1imFo6ipn4POemMdEyIn1vft30X04100GL6cm626y@2100G0BtW1a404dqZGgw4aPm + 37AYGp1Fa5cFG0m80I04a801v4y0400G1220v4e0M20c62G0G04GE1E0a0WeIk4o98ZWwef6 + 04W220000WexEJ6beW7MY8jN3oSecm0e8Gu20800aCm179Om605G2G0yaN3s3j081103uImL + 77yXG1LUO0202YcAOuEW2kCt0W00WV2K090GWaBjfN54w00Xf1Ouf32AEWYxjoOv02c7yWcD + Rf60C_3fWI5A0100Ibr8a6G48G00YlmXN9Q8_564K004KdI0C00g1G18W00vHuGV34CjI1p0 + S01100600WL7m0K00Wa@OucW9wnkYCCA1G0mmeAA0300SFa2E9WWl0AeBu38008qLz2HYMG5 + 05W000OOQ34b0000GWe4Y228fWiNH2214GvAA0mW4v8W9QR8XW3aOzx30C008C00en9gG000 + riH10510UEvWM7AO312oQQZVjBek04E4mWq3QOMZ3UJaaGhpumm4YecWc0Mel44I6WWX18uA + 02Mum04W103DdG5kF8000eNR2gsNZcCY9z03YG_XS2O8V04o9uWQ0A8d0CUqPcn0qe844USW + WOTCuLS46n1ZCGX8402gkgeqefO529kCGXOoBefW4cxrWZ2O8YpXYJeYT680G40KdzCq4m5Z + iTIEeG5JZ9Z7fHZN5S5X60081cCp68401R0W0810WkuD0800qN34KFX1d4GG2w58008Puj3Q + UBX8080WG00040eH1IuXW541114gJF30KW200W39A8L82gg6X1UDeqX484004GG1x9GnRD4C + iw1fSPGp3BK1G1nUPGg3p8100OtR3A2eWtDCeKW2U88Xo6SeDd3oBnXuRA8117Q3e00120vI + b3GYGIbaa4fgIWbaaC9B8HKIGI04a50AB8HY44498PfEe90199fIWGYw790GI2I3g4WgWcG9 + 9D90IIG4bWajLN0P890IoGIvKd00GII0baaXnI0aaa4H999IIMI2js6P19DIGIKg1W0IJMo4 + aCa0980GoIoYaWa8GQII54qa0De91GI2Y4ua48889I0Io@gB0P999G0Ioe1G0XaW41898IoI + Iac04Q7m00aaa54eWeaa49C99PqMJf2Q0100eX13QQSXB0CG020GG3EiwU1bHxGkKma826jt + 0HW8IyKJ1j2Zmg9FSI51BDBn009CWc1j_TJJ6D8008uY252HPaf2EO1aDgI4YeEOPDX5YSpW + y3K8EG4YuSYaOKvY8VcHYWz1iOl7DgiUfGhJfv07o9mWDMGOKY7UeXYp2SOrFMo9W24WaaC9 + 91XKIIMu11GIIQAy819sGGf0G0G2GowQ9WIIIIx74mQGMgz32ibaa4221qaWac0W04WWa898 + 9PJIIYa48HQGIIL8Sa8YB8989PIIIIjWai6W4AsdWS28GB9912IIsuiFmIII2iib41P99MI2 + Io901198054S1aaaWQ0C0QIIIE1x4v010102U39140W0JpQMg3Z82G5IssNc95DaEf9W0nX5 + QRvRc0GMijjjPdZYGgalrDJIWdCsUdj0SIqIUnMxY8Ui1KBTx3Pk58v9RVc54aWajjv34I25 + K@cb5DDPNSRsM63u0O9pxtc0e9PCVRV1m8j0ujci9ZOX2mosYF00GeroGq2I000oYKO29214 + CQXD5OAWW11aIYWGQ04a025b8LWYT042008H4X130100YO20WW0AYE501W08HYj490mW044Q + qW0P0GKS19F2HGH0000G087RJO9B80i181W4003cI0bGm614A3Iq0BG42R3jU699e969Xe9a + aWPdWW2jIG340I20WP8IGCD980T01HA4G02240X194i90cMo0Yc08GD51HI010AUOoKG004C + B0Y39HQ9U186X0eD9GqKW0W084aD2iea0W0mKGW4223aGOCIc01HIWim92aWC1iTerp0004m + T9iD5020Wqasi5180GJIJa0W20GfDRxb088GjG3PGX004Abij1IGI2YsMI18982QRP5211HY + ARYoW0000i9RBI20W0MWjD10I20Wqbq20K02zc2a00080OGRWc0W010fCJ30004acD0GGero + mq_w7Wa12ORHRM2Q00eE5TY89WImMafT40000E5t90AO214la0W810mWYb5K1W40dm1S002m + 0_ieTGWH42zcTF040G1zqKKWCIWGn0GQI2I20@hVH0GqIa@Bnv0B0J0dR7yi4180_JsxGGWm + b@3jU64W5aejD91G0MYmssaP12eWORJsMWb8BhfLJlWHIA8HRJA4fjCGjP99cGW4maqiAAIQ + YIRMgMG134KNQsMWWPP0jPJIWab9maD9D20WKosssKG2a0eqYsc8YB22RRQcCXX01j9HV42A + 4Xc69j0Ger7H000e1dCoUfW@519DQcMcnYNVde3W5QlCXJYO8rh4o4mXpKsPPW3gO_WE0A0W + 00G7A8SeG45djm016q0W1jikGS28rVm2FG5Ho0HCW06n0OGwWI100egd164040iAL1ThGmes + 5yE0280816tEXkhAe0x4sZZ00W00LGrmHjECVbE8012Uj918C047SjGE1980018dW2G001aE + W1flL001GWS2EOqJ9o9mWX2I9mfHggiXZh_0G00GH0AiO02fr_GkK0902GyTY4sXoW608uKj + 3QzWau4O8d0SMAVZXCW02G0of1R0A00uVH3kzWWMmH8Ay269uWFaR8UUV0410ygb3v4SGGTC + KcW3200Wo9u2H000b9SHerx0401O2W2W000CSv4W00GkZWb0mZ9dWBY4uXpA9uTk6U3WY44M + uvV5_YMZaBvP5X30420a604W000o9uW33QG080m048awW1X0Gmm76CD02HmcGLjDqHOEA800 + cX6Xm4G0804Gr2JCcR1BFeG507y001BBmm@m8Sy099bNHY55WG00ef03E0v02000J8S0800W + _vFeUJ4G0000O00e5X2EGEX10Km110L56HaET1POCJzo6CSU204GAg0W061m2l3ym9D4aEG2 + j_5X000mM0Eu5b7IkbX10e182GGX29SWe1ZdSm117q3G1WG00U9uXA0Gei0304000G00W148 + G038C@pGW00WwUGX69BuAX3W200qF01POWGQ270I00OZP5g2mW218OVJ4wjZW4Ex8HaNwmYW + 7080GG0o705800GeRW2w28XwB8O3030Y00qg42G200MDOXN0CuhY400404vX10102s0GX79j + PjV200GGaJW1FHWGE1Dqb33@UNGE17KAw5V4eGgne45G553KmayCKKG10104U3mXW0AeBQ3c + 1918100l1aG047SWvK17J0010Wy509I29of9c0dw9WW2MAu21100D5qme0Gap16BYCIE1L04 + 00e4d6w5eaq6IOnW3wCBXpmQgy35YAVYzhIO6G26peWgBCuP16oSYW_2GW020Hd07KFV2dYP + W100WGTc12m0W408040G0@EJ0094WIBCWW02mi580200yJU50402SpX3Q000_SO120W0RTmG + 3PA4E1GXGDH_4QKTm4Z8VG2F4KKG1BJ4HeEneCa04899Off5mIYIWage49998u3YSaai4G22 + IYa4a489D92IoMaWa087D9H24I2baa4P1G2a4e41890WII0aKaa88P95I_GY0aa41B99I0aa + 8T99HIGGoW0a4P99f1iBGGIIgaWaWGhhHz5CfGGIYij9G22IaWaW5Q1912IMIiZ6a80GIY4r + a49189228IB2G0oGIIa05aO919HG0ayG91c4a88919GIIIWiaW49898IGIGXlk0988e22EeF + M22VL7W4080W08__110004V3fW000WvDYukf2YjuZF7Ge9072jkc6LQ820480000B8WOd03E + dWX51G0110nc16SE01DfRmejBSbn104000200q3r1V8UpnL7K0E30100o1m01802Jdy0W00W + 6MAG001Gt29W400CeV6YXf8O000Ltz0Y00Wi_JOQ09o9uWJ1SW000m2b7C00KHCIGsaf0004 + 8OX3wigaG41ARp5cXHXvgYuYW5QCRXX1W8bD8o9e7aWia8819ByW0h99PIm6IByW0oIQMaaa + 41GI3Yaaa68B9922GIaiaae399HIKIYbaa499GGx740GGIEf@221H1GII2LXu019192IImpW + KGers0O99GIMgoa94GIo2YfaeCP198oI2Maa55t6W09998MII0aaaaO999Bd0288B95DW2IK + I4Y6u0GIIGZ2KW488e22IWqaa489192IImWaia2EHdmxNeRyBUhnXI7C0220GcJYi@m1fSDI + g3KG9HSHtsNcfjO4HRRTsAaw00ajuRBIYdMscdjVUbbGUqbzXzRJBJoss0B30FgFVB2ascCy + ljPpWK9Wij5Rp3hY0oMjzX4QA3Qr_sYe456MRRB3t1C8DPVxcoXg8ibjwZ0WYCutYja90m4O + VsJ602jU6mIGKG006aGQ8H08HG2CW89va88b2W0030aH0000e04rN410008q0000091WAFDJ + C009sQ20H8A349hH04e8XX048G6a45IIa00A1M69H060Xsq4JG22W0JH00BO0Wb504ba581m + MGC8IYimss2jM6CDWX60010aaY86042eQI34GJ1Wa988IWB1O1X8P020GI8Y40D02aC0KGo3 + mG4a0202YG99bGGIKe4I2q4i3XY2e8GGmb1710X08Giaq04YY0mc98804W00x2060I0m0OFQ + 6a9HJ4ePO3M459iTerpWa04q8fi950I0Wcaok5080GJV3s0G01GjDOR0491HbAR3Ha0W0gjj + j13II0MooM1000G2PRq040GmwNpqWaY00C9J3324W0s81D10002mqsq0I000ncW40C100ORI + 14WW0048Tbr40e5fCw922jE6JoLKea8W0QBSp2IY00jjeR51460qq6D70S0eCman112031Ya + X00000YFDP1aW00OB9L1J08G8lTv101GG2Zex1aW13AN_Y2Wa74ERNFJG0GGCmVwZ0oIc8qh + l6W8HMyxxO7j441G_x@6WY8WyVerp80i1HjjDDH0WICssaiB81K6IJosYiGAnfDJIb9IOQDI + JVW8j5CA99jHqaW6aasE3QB3IIIorG9OX2QRZq2W5AAe9QRp0011sifjH1I20odccZ0Wa4bq + ss430Q4OJRoaf0488f9J2s0i4aqC9502j_e4GSeBH3opScWuIAV7LQAvbY2y9zc9W004qAW1 + v0GmIVdyZu3r9Sa004WEhC8Nu6sBb00100G0016nzWuUqel0GkB2X10c9V93K00G0H001880 + GE14yYB2G00400WW0180ee640K20sDH4T9WGZDFSCD12WG0MJW7G009rPNmBe6aJG1jviGB2 + 4844W8C05o9uW3CEO4J22WeWuI9eq99GG00Mbq9X8MoPKLi205HDaG5eVCwW9v4SnQb9yRG1 + n9m0K00WE9Y8o5229eWs0A8c09M6u102W099w3W00WQ4IW002GK17irH1HhQ0102WFkVevr4 + AoIXe2C8m1AYeNdGhBej15o9OX4OJ8dW8w6OXS2U8qw2_8UYGhx93C4WG00qVG2VCSHp3Bya + G4HILn66YaJG5W0046bWXE2Qey62g80Xz0Gek024001CIG6HBKm0jLa6jC40W8AFOYBZBuWW + 3o9e00H10P2mG6650G08OD05Qh6Yf7KOD14os_64022l4iW001WQ1CeW02Ex@WVECOKW9G08 + 0aQk5xruIerPSIQ19ciW00aX80AG8020020XPM8WG00mC1LaIX42A00UGuYCCa1801mN34KJ + 01f7JGcs54DH14000sc810O00dNS1G0GaP1IOEn2UcOYIVLgm05cc5XI5AuMX2gg9XS2K8CT + 3c5nWL0G8883YbUX10ifF0209W40400e8Y50100qxJ1VDKmLE4C2X3W800UHOXE6WOkW56uT + a4Hw0100q304G8008l622FW0m001006026m0G080t7u0WW0W1Uk8422AmWXC7Me5nKUKXYOO + CerY4E9YWS2EOz48o9mZKWS8d0MYXn2WW2053Wm696qly3bzhGY08iXq4l4ymWEwqMm45HSm + 3050G80O203A6mY54AutRKYJudh1GPOW6o98jx0U8Ps3wOfX67W88Z2sLe0200WF1C1140WP + 7EAx24Q6W08100bqkmkKIW64000W0W401Ws0A8nZ4cwlWI08ehY4W000580299DoL7QKg019 + gJm319iCi1f10HO7AqDm2DqU0440WqeJOeX40208VCW1xm6Ig3K0200HG000220XD0CuoL22 + SeYpQiOvOBEhAXG3e8KdLm2G2gaba4Ee9Rgg50IYKYab44919AI2IYfeQ0022YQ7988L340a + 48989H0aa4f198I2I21fM0Wba4819P2G2I2Ib0Waaarfg04aaWk89O_r22jk6iaaa8899X2G + mYWaa0H899oKIIa2WW09A1HIWa8XDBHI22YW4a0D9D92IQQw4m09889IWaaiP895D02IMII2 + Vr0989BG0aqA8e0f99154G0D91f22C8d032VTcI5E0204Gu6Ba562LRXHG3CyCa3XXDHg3uG + 0W48UW30300CHG3JHOG304SUr10101Mc0Xh2UeOw2UjeXaAMe89TsCmWu4AeMW3W80080G8u + _28s6WWE6De0h2AtEXppie_a32j_df5I8d0468W01020X0KmO08iSA1XzlmI3P4El3J0Kmh0 + 5q8ZBj58IoQ6a4m5lYCnT3841G1Z2FIeEDrlf83fGGqLu4QT5G0oIaaa89BB9emZ3C991pJI + oYWaav8q60Waaiz324aia09991GMoIZ97S0012II221n08819LXa08991I2IIacWag291JGI + 2fHVpL05GMqoYb4cqyq4W0ba491RPD040GMIgWW2w4u0oI2Qaja0ODB9HI2MW918Pq05GG0I + AQ044caa0999fWW6KIIIY4iaiW072E9c7rC8@E6g8fYcLFeWZAEvebK7IXaon4ijbD35BYaM + s_qd14HRQRtssKaFwyDBF5aejViTRBHpA15cjcb1eO3Gqos_6WG9HOxTx68FnJOFho6a6oRy + jAf1Zn2sqojlb6QIK8s_V7I0O9otssCi18HORRp6u049eiDRB81G0msQhUXGhN19540K4yGO + IKG8WG2CGO90088118e0GX00HOZ1200I80G20aa00Wzi2I6G20M030B9G4a9h01H00WeG54W + 80904WKQYG5a00gW40n04YeAIm00scs0QII41O3Y009G25i90Hb408Msaa1IaW4s6QzCI2AI + SJ02J8915i80C0r0091aIe03IqmA1304JW0YKA4200WOR341IIiC9301Xi0W8o0WM248a008 + f4WCi4QmK0OW4W87o10888fq25000100e8RHIX910WWj09Ica81vMaC2Ios8Hpx7b8gROxGh + f1G0SYqsM50088QJP1X40089jiL00GWiYs6i20G4eKqej00GI2RJssq400WDJR900a0WfbCe + 0200GDijD0IGG0Y_sa1O002QR2cW0404DD09W008GdIIIG0000eDf91J020qcaseK8WcaaGe + rqGmMc6a4008QxAT2G4efaTPY9120mt6uKe007WSB094Ae0GaUQ200100eJw78G04XjtOI8G + 6LmPCHI0300o96kEe00GGEc_G20aZWOgtN02sa2T@BRWGIIa8@jv809GZG@Z@KW410QVt@GG + jLlGerh005b4fjf9GIm29asde3GRH2RpoqYX4GGffJJ4COJ9DQJJmiD00g9ff14Go6sqiKHO + JGKoIQr2HRJYQJZaW1C8QCTJI22aeDs0D91WZq6Yssc2K0W4rrss4P1O0GIRp69009CjDI2m + 000aqXMhJiN7CDp2bUmGG8HiNp730SLbn9yKm1D4eGv974Lm1G0W0ApvXpQGeNrGc98d22AO + ye2AbBY6cQeT03o7GYE2MAKW3440WSYO200014aG0SHA228IGoAWWSfIe713wXi00II076a0 + 840eW0AWH00G54Iil9FP7OGIl5KD018002kJe04220XizGIS500WGu3k4W00008W08N16ok9 + XD8GuzOVYbr040008004o9mWe1EuL02YrfXS2C008GGx06iVi2B7amH2947G2v4OGtEa4uq6 + 93OGcFC0101u303c_x00204tAOmFd44FW2W00WE9W0W500D4eGZJ704W0epw2wtia2fs8d07 + Y4eaLJD8G06YTLfORH080GIq054oS17NUGB3708WWuoi5gTiXo08OPT2010GC302600GYGGY + _awHG0K0J0Wac8M8iw3U0WWu8G8dW60500qTc1v40H5S6qxx2v4yGerxKo030400M5WWw7Rf + XW3gjycS2gG800G124800Gy7X2IRy000W0W400QAW0Y0W0n1eW440WXUL8nW26sbWw4AO5W2 + c@7XYLFm4000009WGhrfWS2IJ01C0043181f00WiDJebW3YakWh0A8C04QquYF1Q8WpPsBcW + ua8OTc5G400K1I1f1KGA07yC01Y000QCe040G0h8Z0G08YU3A8QWC_Nvam9kG4000I000010 + 4jCKmXr4C501T0GWG00WbVGO9a74K00q1G10101g0LXS2Oetq2I7mWn888hHRU5oWy3AO@O2 + 04000404uT02MIjW74HuuN36CnXAFCW080uCIQ110G08W00100YL9CuNr2MMrW@6J0004me4 + 8e0008r04wQ0Xk0COoW3UTYfr3C0f4emS58C2018W002UjYFVAOe16Qu_WJ8AuB9BwC4bmNj + 00e0G315080K00O000400204W9wS0422WOEK8414Q4m00110J0KW080YLB69aeS0200yv92W + 000kGeW9VH8dW22buXS2I8Aa5YwOXS2k9EXBQ6eXL6M0480GI3FSYr2hRimR0AqiK153CngE + z4eE1@3GmY0Nqeg4LFqGfyEzW34R5lmo6xyZ0FfPmHi0RaLW4J2mmhe2D0W6W200QYe08000 + nDOmz540G40Aye24500KJm2FvYmE65yeB24020Jd0Xh0AOw12cEmYGTYvH03O000iOT2f10H + uE4iG01dKSmNTDqhp1VkFq@2LqTJ1POGmSyE08G0404GmD04qWX2bAKGQ05C301Nsamev908 + 048fW24800i115Xw43I0IIbaaiG91A1GI2YCab41A11I2GI4EXaXMJ0fH1Po2ooWaWi8988H + GIGYaa448H99III28BuBHI26AiW4CLr2O998HII2aaKC4998XSgD0e89PTg48C981IIIYWba + asgL8qQNGI0I7QD1ImI0aWWa1P89XIGIY0aa0I8992aacCP98GIGU4a4K4899DJ02InPJ0MQ + II0a0P2soIW0WW98990IIIYaC44898D2MIIi4aa80IIA9M6A8e01B89I2I22jc70100tXCH3 + 35CRH51DSHSX8ShJ5XXDJ_07KxE20400MgfY10AWG00GZDD0802u7030A004AG2XItG@D5yV + t1XMZ3HIWWA0A0X00000H0Y000BHRGEI9i9l1xVLG4240808O604wIyWJfH8yaR2jkYx38eT + 02wyzWt180808oc24qDG1fCjGSZ44pm48000ZtahK4AeXW3w7WXqNuAjcJW004004Meva2sC + wWX2Ceab36i9Ye4C8Pl3cJaWE0A8vE3EO1dWJgmQGIYWa4D9191IIImaaf4Gf98HGIG2eWaa + m_BGII3IDq40IIIYac0Km94aJD100aiO999HI8IYa4aGTq442I1imaa21nW4H8GMIImC85m4 + aaCD02MkcWGhhn2IIYW44je1A0P8PQD05GGIo2a4auQs4O9919D020918HIGG8DW2W4aa81I + oYbbW0919fG38uqV2gFXWk28W9DGI116aJ0254W0D99XGhrfK138G00quG2LLvG26BG100e7 + l86p0XWAsvE0Ae9mW5QD1aaaiPRRRX0Ws0jjlD3JQmEf9WWX8aibzEJoQQCsosiY1XZGQVJp + IcafHiFRxnza4iaORR3Hs00cjzj3G22Gytss4jX3mORBp2Z0q0DRhwcZ0e1alwRZO041ugjd + 5b0K0ioMscGhf18ja80Wi0OMMs4I0GWGOPWG48HIg908e200f0488JsqDB00880GQG01GGG6 + 01Z60100K808060OHYGA8GXi8ORa48906eW5GoKK00Gm640W04Gs6sWJIK48Q3oG89124i1P + 9W4O9Ks4i1MaX4s6QzCAYuISGIO0E99HE40005a09Wc44C3GaaOPIaM3J73KZa248QGGWQ23 + 3Waj41O80HGoq060KK0WmKy940W1mG0C081Y408I4Y0RQQa8X8WW889WORHJe818WWD2BGaG + 81nMmD0J2a0Spo649IJOxGhd1b01WJIQRe0200D9DHBO00WqaWh1000WIQssA8IIYUr6Y001 + 10KRIQ1aaa4ibjC2I22Wqo_A48I2ar_af104GGOwKa008004OQJ20044ajj954000YD95t4X + 05989O002GsaoSA91qas42jc6XqocWa408PJRp2I2Y2DiFRD8PG1q_ujd4000MWq6100J9YW + Wq10a4824Xf0W0424ILr1G006Ob4F108GGscyE248AP_JcsW64W48I37300G24xV@Z0IYY8@ + @f7m9BICyls71aG8Kzxyd2Y0ayVerp019aGlj9D1GG04cssi33H16JRZc2f49P9DQJa12J2f + IJQH4eeC8vf9na0a0sscKHI8O4wRQqGP02WIQpqZe83IC9JRpKWC5q8FD1Ho4KoqksWK0m0b + qsr4P0I0GQRocf0K0efDJZ40a0aqCf502j_cLbpOvbD0400qmi9Rx4KIn@42B3LwjmZa3140 + 0OMr2610XaZFu8kDEsfX_uoetQeUfZZ4EDOY0Dg5id6umuIj3040806000G02481000162Ds + 1Hmq8K@N6Y000wbWXT5GOQ9VG024KE02208W_5eW4jTu0AIgVAYheB9m9Gg4314200d4a0M2 + 0Yk0celW2wGuaZmUfNXH01G0C002rIPGu0UyTnMxMi0204W6eFOvu3UakWJ7K8jX44W80CS9 + 2r7NGg3A090Ge@W5k0tW0rDAdWK_wm0C400v48HRj5aJG2VrkGGTsqTd1r0KmjK4yuB1F0GG + moQKgj1rjOn@5Cq4W3VI4oG0NymX2@HGGm09aWW2l0iGF08K301H8amA04a0019NcGS4Ma6z + CZ70Hm58qe71fham1_74dT390GGi190210e6W4w4GXE4Q8d0Q4020a8G196JGs05ayI2JtpG + b1CSSH59hypBCM8001e6046CPXG3SOU0Cc__Xi6h8tTTE1nWv0CO8W32oJXTNoOXW30C00SV + I3B30nm26aIeGWW00W00Wa5n3tXeGLaBiRk24240EV0XVLH84R3kQnXmLxPJW3W00mCUW2C0 + 20EXXXa9Me@_5cDcWN4I8kY32Hif4hAW0Q0Im05SBF2@3O0A0WW1GGug03oG0XkSDWG00In@ + BS501794nDC@0808emt4o9uXm9YuK772naWS2S8@ufwDOXVZM8R066j8ZnXaOJW3AJud6LGe + j04UI82G2001SLI4164d0KxXSGB170400wwd2_@8Xz3geMaDITmfK6MuPZGcTeXD0G82W2Ie + 4XK1MezKY400Xan1201007JeWG0AOXq5QXzWJ7A8UW2kN6X4uJ080GGs26Cdx1XMJ4080010 + 40FzomOP6W3000840qs4X8040Oh030400SBp2G0010002a5J2XMhp8lC0G04000YGhHAaWm5 + 0A002CXY8A8uY0822GXGTY1P8192IG28aaWbcIWW4i1Q199200I0baa8HIoYiba0928f6KBm + YII2Wya41819IoIIa298GoI2YaW44998nWKHG00IYaWq48GIIvKJ0OIIG0aaaA989H2mIYaW + a4D99PersWCWcK98894IIQ44aa8B91rYGH2W0a49O99GIa4P9B9GG0Go9G1GIIGWa448999y + EB1H3G0988bDO98Q024cWa89819d02GIII2WaaCD02wXbWMNV8qwQ8000jj145IWGQ3Qi@01 + t0aGC08aaqI0200Ro35W040NiG0W40000004400A9WWbaA0400KG054OF21uWmK04q47F016 + 02uoWM380840GjAA08000400Hu1LqiW15iW0100aO3A0W10G5190800QINAYw06G0008020w + lY08G01v4uG63Oq9Y1zmCHJ2JSFeBpECHwTGiM31X2wnaF25H4A80W0gNuXF7Cuh05Iii141 + 0019OnI2GKOWAv4G12oGYGhB8tZ2ai4aG991HGJIYiaa49IIImaaa888Br9D18899wYc0190 + 9jVKW4aa49998I0J2aa0a42o1aWia8199K5Y23XGGl85a8oE89B1HMII2Daa4199BoIMmm_9 + mGIIIE15a7G1v4Gmh06q9m2IG2IY6WX6k9uLW2a089LGG3f1mGeru08308IX4gRmW@h8OsY7 + I5BXbS0vDaQITW2IRYPossoCQ54XAPRpQ2m0afjDVR23qaxtijNHfT4odciFfQBGOos_FmH1 + zHvzRH0c6HYlj590q20szjQFAUqmoUgzDcJIp2BssQMhC3XgRBRaW018RRVpK0m0WzlDR0QW + 2WssajaQ030BnssS0008Psss8000W2js0ysss41000SRR7QD7081G8WBO0a454X2aXo2I20O + O0GQ8G49W5G631mG0OY2210OHK70902451WWb01H0GI829_6IWIMG3IH8800Z0G9G04002eu + G1B0m04G60i0IYDiHWaa4es6s8GGG2OIBRX58AHaWDL3eb49WjDR3ba89osijnIYa4Ohjw28 + qssg1IIAqwDaWqku6m40GGI2QInO4g8fG2e5182aA9K06516WaAAG01bG2280a220G312021 + O0m49FA1iCI0WemGe0G3Wm4H82Wb0OGac00q64080m208OQGxsmc0A2I0GOOMa0XH20iORqm + 481IcXD8IKa0tijjGaaaW7Qj1ejjjHaaa8mssc1IIIerRW0W4m9jlD5880assse4101GQQIs + 0440O0DR25091GXARA14a00ej9402I00sImK1908GARRr2011WOPo62W088iCRGI2040sijf + 0GG00ooqs2Q000rs4c04400u0IZ40020C99J20000qs8912000r89911000Oer6W8999j222 + jk3WcGcWK000JQIJ300n8bDbRC8840VK8@g5083kIWxX128236olH0WCD6kzI0WqG0q8vq12 + 000kZ5@JGC06anCE080O98oMy30GW8CLHV2WG008S@@38G6YCVFl7OB1Iqaly7aa49G_x_70 + WaaWl@@7Gaaaq_@@7Qhs0eaaaW_@@zKII6Qz68A18LQJJJabaG29j9pWG2bmcrifI8GWKRoq + 6HZamIZiq40QQQYIQQR4CfeXBffHaKIWWsa49qcW4jcsSD83Hc0QYbsW5903DIQJqefbaCf9 + f0W05GjfjDnaWYGh9ma020cccMH9120IIJrI000WIRhjQ20GRRpc1000ejDRZ0WGhJ9WODsM + Se8Rs9Nc26d1XxQE8f@5ANkZv2Cuq7AsjxX10YvSM3YlHY4Nd8Lb44002CDa6rlvHXTm4Lv1 + t3S0800WZSL00008a00WBxeeBW34000G0008aW6oQQYghvPQ02Ib0180100440gwr0Lo0040 + 10shy0W04WJ5rmYJA08W4uTe840G0CLG1l4mpo25aMC1v4O020Gnk180818mN140I2082020 + 420KFC1LNRmmKH02000K20mm15aJ02@JIGE1lS1X6DEmGOFJq4H6r3CociAaJWDG040Q9eY@ + 3Ee814UJ5X50COch8ca2ZO4r1G00HamCixm1G0G0M7OX6@Oehh7AAe081200400weOXj4E9d + 0H4100K901Z9KGE1EaIm1v4SGU16aJm1VISGE17q6G1@7kGE1LauhClB4n@17qf01XqZmP27 + af03b1OmAk9CF13F38nB5Zaxk6B2GHPZ6iTm321W0I30YB0C8kW4g1uWb4ceylRIju0W800V + 1WX8W0W2mBuUW8Am0Yv0UevvAwYf5a02W1EG0200001I056ZGQ06G2008H054100CGn1@fNm + 7hBKgh1v6WGvAoaw0642020K08G0G00010Iy4BKTT1B2CH715ax34rEcG4u7CaY3l2KG66nK + S014200s4e080G000G0Q0WWFN80GY0GR74i6y13Xamp04i6924002g9810200X4mG_29i8oF + 020004G0jDG174SmrC6SoI1ls@m_1A8W0Gu2cCg1WXzSr9Cd200105513G020kFmWRYGe012 + 2XyWCCMuA94sbe2A000v3sIIvMG00GetW401000M008x480400i14155K0218W1T90201GA0 + 4y7p20408EmGaL9X9d02U7WWS380600mMLDaJG23ceGeJ7K3W1G8G0wiyeu4e8Tq366mX@79 + n000mg0DiX530100AJQXsm0Qyx5E5eXC4SOdU66G4em981800mP94q3m1DlSHT0CyZG1b_SG + zM9bJW5LCmmpL4qJG2ZyHmX4GihU3lASm91JCDW4JYO3808ej4Q0G00HY8403000804Gs09S + a01tbQ04I0Wi1I0I0Wm34B0441e6W3AKmYGTYv6X22VjWJSF0400QN27qx31h4G0aB8WS2AO + dM501G9CAm2@dKmE04C4G1v4eHeErG048uOu867eWgBKO1W24008q3W14100EnXY@3UOJq4E + 5uWGTY1891fM2I29aaabcM08HG9IGI4WYfk81P920ai09999mY0I5ai40981H5IIYa1XK999 + BIIW49B191fIW9489GIoI0W4ae991JGI22aaaHTg7G919O20280985aA1A999H22a899P9LL + 9aiaa4Qz6dIIWWa418981r0K0MKI044b0OA39P0Ya897BH222c8ay08898IIIpWaaa0G8BLI + G2Y489TGMI2W4cce911H2IM2Wq04999OIIII0aa6GJIIMgD1MII2sSj0cWia89e9B1WWijH8 + MM22j6cSJau402QO0ZAAAeLY2w7A1400WVf3IOOpaF41zfqmG18aDG1DYqmS47STH1jqRG90 + 5C60194Ym017iDp2RRKGz9y0IG48vg3W00GMPo2W081A8uW7sGO002omQXBYI0C00W081WIP + YeT94IeaZ5x_0aWGGw09qzZ3FmWm_z5Cq11G000O100yZa64W00cI8XyYAea8V_4WWj3VOe0 + 62C3YO1ouHATYJG32G0Wn14o958K5W2VoqGP5Ey903Z5OIE1KWqaW4991PZz50JoI2WaeKX7 + 4WbiW491I24aa49988r0G09809II2oaaaWO999rMD2c04a8918DT21A1f9LIGIs621IW4a_3 + WWky9GG2IIb@Aa6j52NII2j_ZLiB0A8990IIIabWWv4a0GIa48999T2K03GIMaaaW819BLI0 + K_501sWaa89B97D02G2mIoA9XYLMGoIIYaaa4O99922IIaaeaaJW28E99p9uWKK88u4FsOeW + I5AOVX6oQjYBGMfWC46g8Y_8k8r1Au5L88PRvpa7m6fc@D@HQJuctsjiTGQxDTHsI14GwgR_ + _oq0L7XPR9Re6td0ibbF1J3I6ss@iH7w9KN_ZkPFnI29hoseKpG4yAzP1qac4xjljH010Wib + jD38110_ssiX1010QVps2p040ajsgHmK00GD05qMT1a300g1GXGhf0WW44A0yKfWI00mI200 + 02G0W1G78a40e8S3Ohb800q81GXWXW006S500Y0KKuY26121a819902nG20EWM00802uHG10 + 0Wci42j801WaW8G003MossGvIG4RPRp809H2Wi9R16499IqajX0aa4ogjjPYaa4yJq60jjj5 + Waa41ssMDMIIXMlXKa647mYm4HCI0B081G89GJW542m2M9j2aW0G151aX2e010aNY0cYW6BE + 8mGO084Z14He84K0W10C2e003oWCfXm899319aG14W06O02082G34vMs4JII20OJp2a8CIKY + 5RJ4a89QmijH8ZY4mcjjLZaa4Gsss2GIII8RRR3899HqjjTerU04W0mjjjC5020WmGsa400G + GPJnsWW40PbDRR5010PeABR10Wa0ufjjH2220ssq218812QJ8b08O0WGBoYZ4418iDQJIG01 + 4MijC1H202GqWa0O280bsaaPHG0qaa48500OBII46000eDf9k72KJII6081XMRGX740000oa + aaGerQmmL_60003mxTIT7c08PDv9YY8200L2fK8000uMUB45GG0GqLGE2400WHPuB002KmLr + EG0CJGIX7uJAG1K0Y8E50018XEK_IW00Xm2voPY2MI23ztVG0IIaBzzzO19HYGzt@0e49XGU + t@8G4a4@3jk0Y_@@XMJWy@@Vaaaa0z@@z0II6QT7iaqae9GHIo6Ipisj4O1X9QUQXCW4ee9f + 9ADbD1Djf9X6245ccaC1AIq0QIZqW1LA0fjQQ913RADIHIXWH408ffj1cMM0icmKHQm26QQR + bII00WIJps2f020CBRQJajLNW0CWWGh9G100WMRRRY000@NGW2000ijjjn9G0jjjbGht0104 + GwDa4zcDzm9qR9O0G00QP0BEFIdoTg9@45Qt138800v4anKuN1300QtL4MDW0GG2GhaNmZq5 + 8009iY020884qec24001UsW00280r0GGWP7W000100OmzrCCMW1jGGmtq4aaaD94GmVX9C6G + 2vyUG2c8y1G109802602400Gd1Wm9h7qlW5f4pmfJEayG7zLNGaa9SVa2v4S0050WTcF01W4 + qU19SDb1@sbGGEXaJm8LIOHoh4W0I0unq5Y7W0G008h1SG0j68110eSs40811z2F3W004_00 + X5nC8Ae302G0aBbGVGyGsn9K3n3fEmG63QSQ02f0mW500WtCk8k3FsD0YG0Euhi3w0e0W000 + fhfGG07WW008M05MkaeS2ie7E7o9W1100GhFSGE1G80228dWBMT@WWwC2010KI85C0m42100 + krCY82C8QW722OXoEd8S2S8100zZQ1FHK0100G0C00jbR01e0WV8A0808m405qBK1GI00EZ8 + 1GG00rWRmAdGiPN236m0100Wu4Wuv25AL8ZP08uKM660014Y00JOemy0AS0p3f_TGkhKa6G2 + jn4It3mynv1DKWGZ4FiUT1FJSmTB6KgzF9bhHD040310eZ14cQlWXoR0G000GH0WAwd0800G + Q2Eynz1POSqR190400W0W08W01XB1UWWW0Gb254VT10G08g2WWmaDeHL20400qJ033EWms0C + 4_tExKqmCI4ywA10W0GYEcWN1K0WG4mv09080G8zY5E9IbVaT1W4040W4WZr802200G02280 + 0003007buW0ZlW4W0Ge1C0408eZY5oTwcK7euIW8kDW0GG08Z1OmIF4010083X52381G0007 + _W0W00a80A0308mZ3Mm000ennYUNWXS2A8gX32AuWS2O8i05kCuWZ9m8EtHom8ZP0IeK04cP + 83G202x4amI0DStx4DxenQCjqOf17bYG7l7CLW13OLG606icF1F8mm_0FqZG6bTHoN1QCPm6 + 93fIerIrtZ5N1iG9O8qGm5B9hGK2MCIP5D9fIYw547D140000180iB024KW008804mV4L6eH + LcIy7G15hhmb5OqPZ7z6mGBk90W208qC5oIu00540T3Om9nJaw0K02W0win10200XUNGx1Gi + C2340W06XGX0HO0W04mNt5K@M5Xw43I6IMbaaam98fH0IIYiq449A91IYJ2WabaO9HIab0a0 + 991HG2IWaaa4JQ8A0IIIMSr09G22abia8189HG0IQaL22Ib03B99I2IIgXU1B999IIQIwYa0 + GIIIaaaKg1m00WaaXlU0iaa41899fgUGerNWaXa59191K2IoQ0GWWa459513IIIY85B0420I + 2aYa41991IqsJi00WVpMGQ0481PBHI30Y4aaWe1C02QIWWdaaghBeSs4IWr08P992IIGW4aa + aHB5XMJIA_7KpW2VLKGhL480W0uaZ5k0OXFoNe0k3Ym1YiEI0W80GIIvG0G0enaB_2W09000 + bIGG5z4020KwSW5sC9YUJiuDCOE4eY51C0100nm1NyJD2BPOmb16y1Y10220cluWwaG8Vbbk + 8eWS2GeaW7o1WWIIM0W00GHPDCJ64JrHLR1NSdM4JmSHV17ahG13BOGrLn4Yu5r0O0110Wr0 + _W020mi4Kyz23hKLmgOBqf01XMh3GIIp2F8GGIMW4aaC9P99KIII4Wba0B99HYd4Kx7AWWa1 + GR81902oosFA01199GIIoGGG0iaWG889Wbaa499990GoI5aaaLXGHl87a8o9f1S0aaiWGh98 + dW24a1a8B99HYba491BhE1AGMIIYabi9899B2o2Iw4e09899I2IGIHfWS288Q03gFXWS2C08 + 9PPE1FWq489u4Qotd01m00XIaG6FECom27qaGC8UyLM55E9og0K0o8R3sxscXfD7PRRBsYCN + 01jcPRBIZ4KsczjR60eMMkli1HII1p_ttWuTf5wPvR2a@_CibiOZqc8zilLR1udCSsJiyWuG + AIQnss3I08BKzxh3W180zRRRc6XS0idzOZT0o0Gscj5G1S0OTMt60Qh610RRRs000QhcWtUD + 8qwD809I05A106884Z0WC94GG44hMWqA0WG84G2108I20KQwJ4G00XW040W00054134n0008 + BsWa0CaY_Z0IA0G02qfWH31m08A02Yb4H0c5DHWDOJR00D81WCXD0e0b0YMaMaO2I4BQ5ra2 + PqMz1YjjjRhM1YjjjQaaa2jU3j4B9E1000bam8N4Y0WQPYWG28qc992IafGOgW281Y1BI0c0 + 0019ab8SIMYH0W02GB9ZGI0002G24K3Ga2EeP225GI1e0D304C55I1V0G0WWG0aji9Iaq4Ov + 2a50I0aiPBo6W91IWYPOZ64X9iDRRhasgBm2999Iijjf2M8qQDGI00uKoca2001GRQQcYc00 + 8jiPRG000eacXj22W4eMiij82001rGMs09991BRBZ0aa40fjjQ0800HDDHJH4YW0qcjX10G2 + 0IscK00810H9BAfe22aaaWe100KP2JY6000i9D92P0C0aYq6t31H4HGOr64Qj2b_OGerNOOt + a649W4OIQPM02AWemiPh12000aslva0O0WOzaD0220eWjiC0C11G5049W0WGWn4WQ8000ID9 + HH01HGGd2yE4G0OG7EnSI0m4XfFTNGaWgWMUpVqIII4GUdz02PG2W_b@0a091YUd@GK4Wa@R + h61FIIIjLJ0IIIIm@@@U8993jU30f4WeDjj9IG42WtqaT029MOJIdKaaG9BDPJZDPJQBHIJB + 0fjjGj99DYaW4Wccs82GIGGRIZMO8GoMARs4W60PX1HJI4dWen6ff90sWqIcss4aG01eiscc + 02G30RQJs004009jPR44W4Wac1j0GRrByV11XMVGRr44Qj6ZIZp@GECpyLho8Hu04SUq4rbe + m3DQKTjEnd0o81F0K00eB0BY28X1WIect8cRQe81A8wg3EEgXZcEe91Dw8814000P0KG@q7y + 7J101G0Myze82A0X4Wml0800038NG4I6W04000rfTGzpE0808e5P6UCNY7FBO0WV422a0110 + 4180GSEAabG32008QQ0YMgN0400GE15SnT4Z5iGn3YK4W6BvTG8JCiXn453unrVH4aOBv2K1 + G080WW00B3Tmp67qA063hkGj0IiwwGvVa1GG0YAaK020GGA38qMS1G000AceWk2Y8vQ60090 + 4Gs375VmvkDKr1CZjIGE1Ey8T1f4KGE1BSAX4v48Hqr74IH3p4OGerrK3G5L2OG68QKf737J + HH3BlaP16BIQGP244xt215Sm1154G13zAKG229Kld1T5eW008Yp1W0400mh06KsyDrGGm017 + 45G1V9O0120W@tleGY5_sp00028TIhmBNEq1G2v4GZ4000400Gv7hGU2D4DW3G200YwuW4d9 + ep02A_rXi4Gun53g7abm9m020GmD16qC01a000ElW0100400X0EAWWG5C8Lr74000ETJ4F6O + Gww4i5m2G0G0omOdMjBu9t2G0W00002uf63sAW00100p3a0600WQ9QO6W4ADeW0_AeOj8oNe + WF18efsT4000Y000222GG8078G0008000200XY1GO6W30401ieG2G00010W0qw@1n9WGeS4K + Px40K0060078W10R2i0900W19CePX602G0yRn30400080Gi5n28020oUWWFUY8TGTAuGX418 + mH00mTCRqkJ1Z4Sm205G100eM050424itG2m000k_H120e0zJPpf564Y32Zgmn9I7qnI5v4K + G6CEaJm2XMpJi5Ba8GB78O0904W81IOk070C00SrrGb3GGywSKqB2PBamY4GidC17hgHnKZ4 + QD8z4uGIf4qP1333SGq0KyZqG1Zz2800ns1_83320408clG3@D01W20Wvcs9_Z3EUh120010 + 204U5m020010G04gD8X_IL02080m00W3sbeT26kSfWn2C8KdO0a00K6p3p7OGL178000OVM4 + 6HuWv1CODO7sCaWb9U88Y62rHdCZHe272MrW140G09b3HanGyjc1b@WGF05aWW4b0WGeEneb + XW49999402I0aCa8B89BDb01299mJ2Ia9991o2IYaWa09309Is2Iaa4WoEb0qaaa091YWaab + 89B1H2o2GLr4GGIGg1r20aaa01MIWaja4913BIIG2LNR0899WsgP8LrB2j_2jesa2889XQIJ + 20aaCd02eiaa8OD9HUGIY4898IGIIT2GGH14qMD1a4a08999H2IIeG02WaaW89P9GIIGYa0a + 489982GII4WaW816IgO02o9W08899II2I2DeW6kH8qQQ4000W800O029w2HY4EMOeX5oQmXE + 0EuCB4IAddjjBOF0780000400ACF24104K@L2npK1O00XVLOuVl3wXfX0dKOX8P2r9Xw2Ge8 + @2w4810120FAS0G00YL0GWC00GnJ64s24e0G0_W2XS2KOS6EYweZv6Y0800muR6is1430imR + J5K3m1HFam404qJL1@z2JR1WaTG137Ko00N5g38D7ymWxBSG_17rfnu3BaJWIDFR0KQII44a + a8BH9ByW0X99DsIGIa888HQIIYaWaKO@58119@u42C999r_H14aaa8A811I6IYi4aK888889 + 9n2WaK1r7WWa4y142Wa4aK5214aa4I4XcS28GMIYIo@5ej4X49AP9I6IIai5a89H2o3e0maW + aT2O0oGIIa4aa8091ZK919893v2GGq05Oe99H22IY409f22C0a4aql05ajD5XzxIf2Cyon1H + YKGg9FysZ1VZqmEZ6qxm13IHHV8faw05m2bCXjbjAGIJqqsscyi98mIRVsxsoeedjPxhsMRD + cD9PBI@LNoaabDG12IWs@ts08DC2@VVsm9luePhroaKvDbj5TR4Xg04Nzil8AxO3r_ps0fQ2 + Gtwsc9Wp20xB9sOa180idPRHKW60Mk@j1WGhdXX594cap8R0WG0O80C0GAm0001m8e0QWW00 + 0A10GA0mU8Y004CmDX5WG26K0IGI09G8W810001YmGOC2o294K0WYI90IuW4KWSa42gH40IW + 20MYas0W0G4839p01QM24XCQ92519KqGi954W4s6QzCIGJAS9II08997ij590d44X0mW80BG + aW80m023mqa48a4409XJ22G108W49WbGe1S004WG22ieao29W40eGo2W4IX0KGDKY342QOaK + 0BW84eW0C0PJ4089mYK8B4WW8906aDOHZa0C2m6950IOxGhd1080XJpJAAK0W0DjfPPG00aq + 4cX0100WQQcmA022YIrsao8988GRRRY0a0Geb4D02G00KIKg10W2Wnccf18040GQsq6WG00a + PQB2W8104ffD5a0a02j891I120mYs691400O3Ra4Y0G08D0J204QzCijip11192Kqa274W0G + GnRUPO6W9aDPN680o0C1gA310G2G4eiW4008eUxsX095Ketmh4aK4WSx0sY02WWue2x3D0G0 + ye5@5180AKo4d6aW048m5u75ea41LEPFW20aWPlnF03GIWWtzF4C39v@Ghd1O00gIQQJWa44 + Q89lH72K29sqcF5I9WoQRqc8QG0GQaas0HI31KIIU3i9X88fjf2qcMCqacAXI81bbtWD109Z + IOJCta50D38PHQ20LaeaD4f19CH0ADjj9WGq0msaaDQA30GIIs698A1e9PTB04QDK5WSHl87 + K1J3fNImbDJrDJ6jbfGtsYq405XeOGJF6X000eAXAYIe040a0XWFokHDSic215S3800ah1dG + 040m1XHCCW2G100sSHXFOUOD026Nma1021800m5D7W404u3W4MPgXE4Ke302gLW0810WlMQm + O170102ONq2_fSYERouIoJW00401008dW2UIg1G00Gj2mmSb6axx1DPf0800W47C8d0B6GzW + mNnf6W8c5WWHiIucXCA7OXa0UOJB6IJuaSfqONG4okaYS2iODl3AtgXJ2I8wF4_jy7a00013 + iGsYB8000eh15cmOXr1E08H0Gg3ASuX2B7KmIMHKBj1v4GZ010WI5A0800G4aE0Y008d09EA + 0XkHE8dW8AKaWshj8qwQIYKX96YeE25Mo7XeFluJD80500KwGBv4Sn928yBG193mGty4qdI3 + @8OGF14qcG2rg4HS2Em0008sFJg10cq1AeNI42_ZWwcDej030200K534@zY0GW8WKHOORR4A + 88cCXLe202M_sWh1G0W10m009O000uc02MzEXT4K0402Gd0CCSD211ammjZ4So9WG20gCJXc + DH8qX4A4G28004hFOmI268002O202kxyWXmR833Pg3810200WW00800GK2W153Gma5IqW81j + 0mGCu9SVu2jLHGr080X4000f0mxWya7W22008G1O0quU30081IQWXECHWW00OE14K7v19Qum + L040I00ezQ2_1mWN7CfhHAsqc00Y00lBV0P000000X2048o9eWM1Kui0308W0KdA2r5KG5H9 + aJ04dbeHu4g0K009oo46CH28000p3Gmm34iFm1fVI03W000044tFOmZ76ae725kS0WG0WOhT + 89fSgekXrUYuY82o2PXgqB8D02o9uWN3C8d07kRXYeEgvFW2okzWSDJO0W2U@kWBdiOmW8gN + uWsHE0P80GK7AKd0GVMUml984AW2dsNGkKBC4m1v4Lnz1Cy6m1nJhGmm@yN34H3q0100WOMO + us14_9LZF7K85ZIM2eZp6E89W9MIWWf4IO3W565jYB7AA1X5Y4eWDYE0W40G5P701W0GG00m + Q140a00uV036al09004jLZ0400WeSRuE02AnZWkO8G008GW19q0W1b_83G08YEx9O016gv8X + q0MOfe3ACm0W0G23GS0100Yz1E8H344101Sm013GiG2dbaw060202BqbalEUufw52AAXL7gu + f042r964aaaA919XYGIWWaa5P9R82aGIi4ya8PB9HIci9909n2I0IGg70IsGoY44O3g58320 + uIL20oII2eaW49f1GGg502IIYaia0MMMIiaic0B89HGooc6D1G2II4XYW81999qwQY0W0989 + AKII24aaa1O39XI0IYWba0R1992aDKCP10HQGIWa4a4899BIW62aa001999LTT1Wia4888BH + I02QkW2Waa08C899Q02mYoIgYWW4O1892GIoGhFG4GIZ4accmNBAR174020qm06LDGmAvBqN + E4vDsGm36awGC40000a00KiI33ET0401WBOMO482QaGXb0G04C0GOpEC9G2hIgqer54e02Jn + KGx594zZ1f3SGkJ8SWG1@C6HYc4qga1VUKGQ0B4hZ8vhaHt29K4m302G0wHeW8EC0910mi@D + SH02D0mm204KE91l9Tm704qmYE200WwUOYG1SeJ8LYGmXJ@O9SYBg1WYA5E86052AObIOC8V + qHo904jaba5UKmCr4Wiaa4fE99I2MIa4da89HGWeba8D113II2WaaW41fB9mIQI4aa4aYF1X + WqWqii40P992IIICaaaa6T102Imh1uW4@BG0MIIerue5iaCd062jc01B99oJIQa899pI2IYa + WX4198AIIIGab4aOP83r9W1@2G0bc4a4iB099PfIGIIi4aW8P99Z601Wb6a8O9Bp0WWS2E8q + QWw@0Xz6ee47GcbmXk0a8WpR8Xk9XzBxpa606ijjFRjUOU4I_iijanRARpos7D3H9Vsttauj + TbvPRTWLi_6bjiC1TOI5MtscPkJiSMpwkeArIABhpsW89R8zShvHq_K4wjkjHEW8WiilC3PI + 3jLJ00hJ0qtot4CeDQhkXGhN1X400WaXKe0I240OIG01802I306Bb80W04SfW9G9Aa081W00 + 88IiWe00200WGU64f8008h1X2Y1040Q5K44G0GaXm40K004G8If4W016404H02oKsGMGK4BI + Gp800K2if8QHK8196c0i100W4s6QzC01JGD9113881Hjb903564504G48JGq008WGK4WGX40 + 00I88122A010e1590fC50SZX0X0M68aGM494W08uGWY4GJa400QnW1O2A48XLX008emL1PJ0 + jC9W0WCBGao81GGWDB00a891w6b98IOxGhdX180e1ORPA0008fjbPBG0WWsMcj1002WIRys2 + 002W2qmY20800GPRA24W00ijzj2I001qssY5WIY0bsc451mghB00H226oM600G90AIRb2988 + WwJad02080e9QI2100068D810QH0YcqaGerq8@Y_0j1G1GIxJG2040e5F9g0m00msaiv4010 + q7vSDi03AOSYc721WemKFRA0000mqDVQ04040h4YR84WSGc6074000Hl4eRm80XXJ20JWI0G + 09hpV0GMGafDbz8C1HYysM@Wb0BXo04@GG4aa@3jU6DDa5Q9BD9mIM2Xat6TPO9qGIJaMW50 + RlfPIZ9BI3fLVR2W9DCG9DDD2MKomaaaAG8BJI3IgK0HK4I3Qc6Wd8AW91QRcc2bX6hB9OG2 + 4Is6s64K42ecaac0JA00JRIsC1520fDPR02e0Wasfj0GerGj7Y7lVumSCPySjKdaeGk0DCut + 2Xxjmi1p4WJAH@GHj0Mi043R9UmQEM8000GW00mkq4ajjEH0h090801000G0W0l9G11808t2 + G0188WqtAuIo280080000GG03G9150a00eRI30200W4WWuiW2QDmWBeIubI2M6scEaQuCj2G + 00Gqcm3lGUGvW5800aixX502I0qGW1N5GW4Y000090Z2q0202W0ax1W00qh59G200fqX8IoZ + 0480053aGE1A0000PkK6a040ybH4f1Omo2649vCxzHGGh580080220Gi35KJQ1V1K0800mE0 + AGIG0mo35iDG18140MiXWw_CudW3wTkX21AOc02Mw8baBreSLJgSuWK5MOLK7YJeXt0C8rXV + 00WWyRW1rEN02I6Wp18eAC260OX3ZL0W008200XDlCusACwUFY04WeN4LK880aFG1v4OWa00 + WS2AOd02I48XR6O8dW2YhcWNeF8dW7Y7GYS2Ge605I20YGhBvJ23I4uX35S8503w5OYi6H8N + H3wL3cWXj8AN265EXWvC0W400W00I44803001a4WW7080B00GM24yTz20180ZZnWK08ueO20 + 810Kt@1h9GmE05aSPC17qmUm8CUn1Z9Sm714SIG1lHS0100X938OSY5wMe1GG00bQdKt3680 + 100200wT78K00100402WcWIQD8S03kh6102G0NHJG3564dW1D5aGq0G4_gF2200gkMZfHg8d + 02U0t120W0v4um914SP31G004xHGYCCIH0e0G3044pm2xhL0140WK4A0801801GWsISOdv32 + weW528ed83e100SXW3fl2Kk14CiT2GI00UonW73C0Y00qZxGyZG2BMkmoh6000qOce2EMOXw + 0CWW00G4HzW000OQ02o9mWa8Ie7u2sFO2G0G2jd0HVD5ica2jEQmJ1504118R5IQbu20H40N + 2GW0G4WY0G0501mic5CpH230qm8S4iUo2800011100400WWW0ma1Gijm1BbZ3200W8YCG002 + mVGB4Pm2r2015W8W32WuPa2o9OY1Yt8@OLk1eX0Xc8Ke8ccKXnMCOyc2Ee@WuZFwc05AHwWS + 1G8la52dOYzI4v435wnqaaaq8d0469uWgNR8a04628X908efXF_weW@4Q9rXBI4mWioJ8lX8 + Ei_WMhWeVP4Q58X2fNelW3_VxdKLDO_A4ga0XXJC0GH0mg1AG001OBX3sqnWPGKOf0204100 + 022P@W5MJOXY2G8KdO040080W0POR262WWS8UeYS86O51W00WW0002JVYzrV8yrZ04000G0O + 8174k68XTHA8Ci2_U0XSmB8Fy20242SPm37FGW00010H02hMGH_nnmeWaG1099KIGI8aa483 + 60HY2IYa0541PP9IIaaAOB0893nvr489193III6Wb028999IWi4ofk011C1JfQ0a4a410P8I + M2Gofk0P998MII2444a09H91IMGYW0a49P99r0GWGIIoGhT1n999IGGQea4aGW99G4M2Y65a + CyL2a1aW8HIohXR20JoI6QD1GJJoWaaa0u99GIGIY08ZeS18081992JIofP90I22Y04k4911 + 0IWa427W00iaa8889H2IoY4aa8dW22i5YmNV1802mV9IaEcAz1eGQ0Ca_G14100IA@c92GuE + d8MqJ10100H2UmF094A129NnmF14i3J1l7lmaEuiPm25WGGy040600O003oE810010Dne004 + 8X8fD8dW2_7e0800W@4SGbO6CdY41POGK7ry6G3TEaGE17qEL10105ExfYR4GeLW7gr3Y79r + P00209004CG10604Mikd62w9S2CAHgXQ0Mem66MgRYIAC0W48GgWPaMpA54G1JoIIaWWa5US + 0aaa4A9892IoI0b4a8nGIAt320QJIoWaaS342Q@W0GJIIjVGWeaW49998YII2aaWa8D9912I + 220iaaky9G9f9PD04OB99GIIIYmabagGW8H4NAMf0oYIIDQJ0o2GoQ08mGIMYCqa43MIIaWW + aw4eW51CeJ03oNXWMME0MIIGq07GUI2Ybaa40991baaa8991p9WWq08WiaW4899WS2qf9G2o + OyWY9M0G80mo2DS9H42WW06ROXK7cOy13UIIbK7eWsX64iblD3IJKuwsNj4DuGQQVnssdeGe + aDvvd_eljkOBRp0jq4Yr_zXHRAImt_sa8oB5Sl9J6D81NPxhM74U7DyjiR3RyaCqgizaNmFA + 8sRs6G8H0wsstCXD90uRxp6dWE0WjDPBCGS0GsiiD04QzC0W1504XG27WGW0I06A2O80W0H2 + H1WO94LGn80G0028430G408X4f4KG406W20G1SA1025QEK0O0649WG44CY1YGGg1a40140C2 + i0G826LmK0GqIq6G0GY0HIO6001I0f1OBXKG9HI0iD70iamsGhdHJ32W3H8I0e1bu51CGe0q + X8KWW9OOgm21Q04AO06c8m200P80GG280Y2509W64C64I2qW0W8XWW65L641WG08W030M61P + JWWGGAYWXm00e0e08e1RY9281Y4WP10449H0Wj1IBa4C8os88PG2R7QzC8900SN7JJ54W49y + XbR1124aMqiT011IKJpmI11GG4hqt6051CWQ9HG4W00W5jCL4QIWa4oMj00GWktmC5W0YG0P + osa049009UJP0084WibjD0040GC959G0100oam898100JIpaW0400jTersG2_a4WWX0eBt5G + 6mW08vX1g1A00WYY7UW0OGe0feC1800XXv7708vk0VmQ6W242WH6C88JW0mjBQ50O0Yor4iO + 860CH22iNI4W8WPF8Q0W00YQB@V4IYI4kfxzG8PG2Koq@Wa081P3s@00XMR3GWYMqac_4BGH + 4GRJoCi1KACl9QB628ebcefn7eX1b89l51cs4Wcas7QGR8GIJJ509fHWD9LAie2GAfDRAMKa + Dmq089G09sOoqk4COOQ8Q2QAA2O0KQRRJe0fOv2288j00j9fL4MI0WqcqGhnf075k29XJ0GO + I4FAKQc104QYC9sA0XQ0Ce3W3E7uZI24gpJ9ArnYcjNuXWNQ3Icd4c8db8QYcWA7M88W405W + 0C0G8b4OmP06iGuD1sJ00G2Wg4GW0W0HR37CDx1fEKGA05KJ02hbI001WWk7Eeip3c8uWU3K + 88W3MODX10o1I40Gqp7SS0122G0g9m002000I00Y5014110j0WG_06C_G1jwaGgEFaN02rGO + GE1Y49f677M04000G002a000g4WWh1K8Dw8w8WYj2felJBIkKca3GOYW20e00aEm2f74Hk58 + 4Ji2v4GHAi9C401fEW3010aJ9CeT23Q6m01881b2m0100WGBIeLa6I_u14400vPWGD08imW3 + v40Z001mGtB8d0MoouWSuG8dW52U4XQ0O8LW32g3cDLDuKp5kHiW6OI8K0AgmDYy0IuSR6oI + WXD949ZsCoGWWN1Mm020GlY9iEW1BJQGdk8KYP1X1OmVl8KLm2lnkm6jFa6DDLQ0HLAA8000 + ONW20201y7m3P5UGHc4iHG1D9eGPp50004OEW2kI6X0Ej1W00Ot37Sv33j9G02G0WGNoep03 + 0100aT91H4RGXVF0200OGX5UhHaK7i8d02IFdW1VSeJW7kLu1Y0W0N9Omf07KKm1vOWGB06K + 9m12A00wUuWCCY1901Hl1BC8X1lYOmx08G00001200H0000200v8SmF04yum18000W8804aW + 40100x0m00500XKgII3M4bx260002meWk8K0110mFjHK@g2J3rpYXTiww1@3Omui44yJ1020 + 8o9e0G00WbTm0010WA28ObW360W050W0@gIGG06aWv2JD_op8WyQq1TLRmh0808008Cn2020 + GCIn1lAKmBc5SiR1r1K0G00W0AEu822k0WW63AOe_2Qcwds2O8mX6o90YVeBuw5BE0FXS2I0 + 00WGE1f4dW50240MJ8Xw8Mu2W4UugX1KOOiW2oIkYyBwPoX7I7bWv2C8wW2U98Xc9G8dW4aW + 00Ck5DB1CIerMyoU192OH02L0G000H04myDJit04XMJKC1F4UY2pMrmig8CN03N4iGE16KKm + 1fEWq5k800G2elW8AzvWo4M0G100880ewjB8D02sWe08010ztR0040XVgCuJA8U5mWiVcvn7 + 2G1004vD28W80UCOZ7tJ0800Gv040a04i102YDRX10Q0600GJt54TY8fEaX08WWk18ef42wL + BXB48G000oa5J8400erw36AtX44M0W00W200YuJCe2fH2rv2i4SW899FXII0Y1Wa4P1fOff4 + 0098YMIIW0B99Y4oIa8aaO119FTQ1G2II0a44899P12dm09299I2I2T0GG7r40993HmIoIGg + 40aabKB999GGGYQ08GMIJ2eWa41981jLhGerkWb0bK5919LIQJ8baa8A99HYII24Wq4PR99I + 0i499A8II2Gaab48111XII20W4aamND025a0909Xe1A0IIIIE150aWb4B9092JW49B99I2IG + Waa48f98HMII20Waa2288qQTALeXQ8SW001GBT7imp3jWXG2sTSOs3XXHpa0AWW0W8LG3YwW + 1C0W0fL4Hx0E0G02eb33MzVX5zd84HRa0104AW1ZCcmC_64m42jq9nGkQia14H@SIS2QSLc1 + W00IE9uWegQ8d07wBNd8Yu9Jz4_70XL6eObWAonBdu409852g1mX7oBu4W2g8WWE2OOkI4s8 + 8ZXbC8roPo9W2a4cW8999XGIIYWaWimZ34WaauA99HWba4J919I2IIaWW4M_W0cWaaC888R@ + e0W4aWr0K09981III6WbCaI3eWQeZG0IIIL84a601881I2jccQ0EW40a4P8B9IIYIW4WW899 + QHIIIK98PQd078199H2II24WWcGhF0889Pq09eaia5P09GZ98C2019Op0Waaa908WWcaGO@y + C004a000_BXX57MeD79W0m0iRa7npV3DbP1PVxPca6M0jljvBm3c4qockDz1ITPPsMknbRov + HpsY6jRlCVh93_is0e_kjDwRKmmoUtDGAY1wsMbDTg09Ofrs67810WLRVBYum4G@ijDWlK0a + byjP0FI0mMscD4130G@BsMoK40WzPRRW000aFRRRuGhDW2000ARRxMv88qwEG0J0X01GL215 + 414a01G0284g0iIIG3GCG19421200Os0m0ZEH0c402029CO1C10We031i0W05XCGW25XGGsC + WK0a0O0pMgW1I2W01O48C0X10ORaH89H2CeD2iWaW66oM0ILI438Rr000H2HRps889IYXDRR + 4a89XoijjWYaa4AqQGaY4cu02W4G0I4OAH0oI19G2Dg1I2c8Xn06f02W4X8204980GG0GIW0 + 01181119204W025a0819DuMC1HI0MaGBW0g0PIqWCGq4a88oH610BRGA3qcQm8IGX2PMCWDH + Y04PR0Ya912AiD08Yammijj2aaaGnssM0JII2PRRR0999YijjPqaa4Qz6a101S2JOJ10008X + fDP1800qss4D010GKQYs61G2GKfosM40eiWARPRWX0aWja9102G0WsM2iG2068qqe909G20Q + nca4281WDQ2I040GW4ifD0aW0GfD890G000sdc8110002HpaG0000fSi55eYaaiU222js0e9 + 9922002js34tCtWCa10_QJhQ6201DfjJ5W0K06sC1ZYC08So8X11200XdgW08030AkJf1W4I + AC8tJ20Gg06e9yJ112I4wWiZ0189OYQt3eWi4SSQs3q12GSXF@32mIYibvl7088IK@s_dC50 + 9GMo@7Zejw20A99H6@@FqQ2q@@@ZWaa4C@@l7JIoGht0G12fQpxQYeXiQSfjHsoIA4cq5jL2 + 0oWQIsaRRaoKIaas0PRQQKIIIZXf99889jYksaaaaaAXI044bscf52Aa0OIsq648G0uPQx36 + be4aD9P50XD0A9Dj9oa20WcacDG3B0OJJq6X520eDHRBC000gNRRBW000GfjjDG000mqssc1 + 61qssM2jkZ7NS9874I7kXnt_8qQZUA8ZB28OzG2kA1ZgUDP0WYgEuWpLAuZW6EK5YV3meTb5 + wUTa8uy0O00mF250X10eV064800Sum2zmimvV6W000e8W460OgFAH01000802Yn3G8ID3010 + 8DzW31iHGV3GSBg2ZGOHO0GyeG3T462G0WW47A0C08GN08O800Oh0200o04401JEn0540WH7 + keDE323WWo1Qe1A8o9mYGhzu9A7IT@Xp9W02W00030YFwneSW30900SQQAfSzna07qJm1x4O + 0i00Wr0q8d062TeXS2K8G4a6AmWYo9uc04080104G0uKX5MDHX4AQu1h6G00W0000C8W3o5l + 00e50f4ip0N9aJW2T0GW018WG4M8d06Y1OXS26fAR32gZ65400r0Cnen7CNc751qGV3KSEJA + BeKoI0C8000QN06sxVX44EW400Gk47KMG22040I3OXLTF8@OH2En20640vQhGFl78020eO03 + oRuWnoReJ04IGnWs6CeoB5gH_0m00054qHl7DqMG6R3MGguEG0088D04U3uW0CQO@s5Q5mXO + VBeu16QunWAHqOy05ITe240G0r0WGc17C4i2200W0W000G02ON02W040y7t3000mM40XyBGu + Qr6Q5mWuH9uCj2oQqcP1O8d02UcH190W0tEiGefR4PA1RO0Hu06SzpEG000IFj08900PB0XK + 00WP4GuOW3kssWGqJe8c26gNX5O693R5o9uaRA9ejX2Y2vX7WAeC14EdbWzBFOmX3K000080 + 003G0GE2DKtG4b5qGi3Pqhm5l0W0090WzjJ00008800enj900GGGc28W400uB@42XeXB4Ceb + M2oYrWPz98UU3MLmWuQqPbP4o9uXOCG8d04000aEXG2bC_GE1Cij35XMVJHxAKWx13mK1800 + ek4AeBW6c9818001B4umf4DyNAFfHlGzwliJZ5j8Jma15iWQ2frm320WWk5Reze6stmYKBeO + NC9o9Ge_1QOhc3k2G12040NCXmR1802G0e7KCkgf19000bv3oe8T0400Ovs3g28X6BIeuQ2o + 5WWaQGeVc409010040Or14o0WWP0A0G00mISAq3G1zFTGJA6qPn1hTRmY1DK6Z875aGA29ae + M159u01W0WdTA0210m9ED04018Q060a01KNhBfEGnM34G20888N4wEWWD2G0800qf89W040O + Y17gQe1010WlWEoUiGKqz1Xwe1I2IIdbaaG919XGIIYi4041A98I2G0aabaA9H0a0Wa89J1H + GIIW4ba4P989GIoI455a01PBH2iC4998WWK90Hf99IMIGbWaa89OeHIIKYa681IIIYba40H9 + 91ImIIa4aa0999HK0IIAh4WbaaiRL2eaa4agg2Waaa09994Qj688989IJI24aa43991WGIIa + eaWBjIG5i5859BHI22Ycca0D999oIG2WWaG82l9122IY0OP9JMOGf1G02IIJae4ag1881Im3 + YaaWeKx4aba40119fW02889nHGGIW6ba0MIII4aaa0P99hWzWGhfPat7c1G1B000vmLHd3GK + 5@19IemoHEaaaC2000W8140100SA226qoW52AOB75Ube0W00WnGD1900a28nvD0IQBuWAC88 + n23QsWY80E0GG0mN17aPW1D5Kmg15KAW28000A48XXHE8V5QY3WXxRYOXW2C00Wy7m3JUImk + MIS@61jfnIebda9W5NCKHc14y5G3P_qHwWzKTW1r0Sm1C5W0W0OFd94040zA49V6Gn_25y6m + 1nRenH6K8f991IoYGpp5WiWaG9A99G0KIaada89H2Wbii89D1JI0I0a4a499B1GGGIA9X02I + I2A998HIGIM521@VG01819IIIG4aaa8119K3z1r0SW181fqeF099GJD064F219YaYI2IIaaq + ar0W0fBH9IIImv4O0IoIMajba0B9f1GIMYaaa5f8PBs6IIaaaaO9XIcsk0WWXaH3G0a0a489 + 9BH3S0QIIJia4av4G0eaW499f9GpIIg1eWijj9S28ozbWdsN9di9UTuWj0C8Cx32CJaK7e0s + biaiblE3RPJasssibDuW2QVnpcc2CfiDRRd5A5fsDVRpocW0oj@lXcmQQOwos4lTJOCR9n6F + 8G68RlN6D4T4aiUP32bB6ygby5HY33itot60P02otssCevW0ORPp6usIRr4Gm440WjlDRe00 + 0aijQRG02jk00000ujjj3jE42W000W27XJ800011011D41X4Cvi0K41J2mG202W1WY14400m + Kmkr8m0aGkg11000922qI808A23201J4C14ZF0O94cGS58W8W0IXY60nIGOfKc690IGCGORZ + 0T99e0ej58Wa4n4YIDI0IXMJ0Caa4nqssXMJWsssM0III4QRRr0995Qz6IQ09T02328KD5FK + 0CI5WMc3I409JI4GOHXW49HIL404mK40800090Q45D118851GWsW1GY41qY0ehW609KH0e5I + 2YW01Q268GGGG87E3094CO8PBJXaD9eWiDB4448H3YaDc5WaOWGs6X1IIOOssM9III8ORRB8 + 9991ijjDWaa4HqssV4GGerQ0o0aqjDiC5QGGaaqsi5X8HIIqJsW000Hf9RQa491HaOOIH0a0 + 0YD4eHGIG3oYs411852ORRb0900WQRGy04400i9OR20a21m8j91HGG2Ga6a002005cqa0010 + 1GJJY4K000ej9I20B00aKCD10000r89910000Wbaa48000jlJGerWm4lA00W31O136OI20Ge + SbCejBW0Gcc9O64019RGiC9239WaA@68Wf5Wg1284K0IG81AOY00OIWzpT00Z2ooAfT0430n + QAiU6a0aG2BFSYImIYVn@VmG2Iafily888HYZqs@4049XRK@_GYmWaxz@@0Yaaar@@@8III2 + t@@@O9991n@@xXaaCqwDG2qaWsqac0I1X0JRJsX90IW9DPQH2Y9fqajzc491jKfDDGsca6qi + scGH0H0IQIh8j0C0999Q1ee1GfxPJH4aj0ac9jHH020Rsao81GY0PRIJ1A01WwIIR2C400iD + jP3mY00cqcj1IAG0QQss2300Worss2zVX14000msssAG000GRRRerUq621L1Tp3rzi7GI5bu + GVlIKa7Fv4KoJnO02008d06oPZWH9PuvK2k3O120W0RxDIWlkWW00gMW2IUeWB088Ov30a44 + qId1BoKGb1609088Pe2G20GG0000e00m4C4W010uWW4giqa57B988369W01200W400ghv0W0 + W0X7zG7H5SWf2flIW080e29PuEW2YVqWH8ge_FOg4WWE1Em000mKa7ylP1l2Gm517aJG1F3W + Gxg60aW0er02MphWS2AOOI34000s901fgpITIMi5r1PEOmd050809000a0930We3K0800HD0 + 6SkQ1nEK0011m47M02020004Wa6EGW01Ga5BqIR213pJ@eF4oe5B3i001081000trUmR3yqc + r6410WA502090G0002duCYKUFeOz3cMeWs0G8Es22CqXopJ8d0T40824Qj2RuZGE140m00ej + @Ao2eWwZD8d05Q@5Xta98d0B2gZcQ0Ee427M5W0G440ra8101GWLVB8oX5cJiWfCGeWW6Edu + Wtr6v8WDG020G000eyY3Q0e04008Xcim5178B08OZp4k2e08400R4S08001080W2008EI029 + 000DFdGe9NKgm5pdI0Y00WaQeeK02s4WWRGGu1X30400i3Y22100AXlXJJceHq9MI0YS2k04 + 00W800Wj0MO4K3I38ZPHOusPBQ9GXW3EeJ096SOYm9y00W0GyYJiBp4JTMmE1E4ZC119SmC0 + Bq4H1z1eGD0Aio24POeH@76ae01rgKGstDKxA2LlJmO6843I3rEImR04y7v296iGf04q701R + 4ymOCdKQV2pvmGJ27qpl2dbgHUZ54Cu52000EInWOcrfxXC_arWRDuuFN4wwWWqBaOhW462t + YG49PU12G0G0yKf1GW00_9e102004000L000C004leJmK1AyWl3LP01900Wu48QcX7osqWoZ + SeAgFo9mcyLo8dY7W400C404DIYGI_D4Fn3D2GGP14KT14N9nIR1Ya1E2pRRHdLY4HqCnbgH + f2Myh1ABjHKO@Y46G4r0emS2FqZl130S0Y20aDaQvSrJsovXIyTuaP3U4LXm08ebQ20201SL + l2n1OmZ3FSkm3txQmB3Pa01601W0G004qpb20200c1BX9088L19Awe02W0WRdjGl97SVp1ZF + Gpb2QytI1D2OG3v6SKD1z8aGE050A00AOx4QusW87ce_A3QquYEeG8NgKmImIgbab4A88Pff + 48399XI2IYG4W49999IaaWUHbW6K9G2IIIEr5W0Xa4e999IIe498O8IIIG4W24y2j1mIII4j + 0489B9H2amC9B98I20IaaWqI3mWPO9eEL4wac09991QIIIaaaa0B99f6W6ILb2iaia8898X2 + IIcJW1CH09h1u09IIIXMJ0OQII4aa40f98BQb0XD99GIIIaG19HIGIYWW0KUh6K3G1YMGIa0 + aa81II_GR2AdD21II2XlUJf2ECrm28800wX0Zylwuv17oqGXK7W120Wm@CGqNn1VkWmNy74W + D48000UC8XlTIOocBUQkdCpSOuW3QhEXnjeO703sp312081dBqmO0BCgN2HTSpC07yPF2jW1 + nLF6aNW1R2UH7GKa1L3bnCLI0OKEWBHWZpUsIiA12jfmGXAb0200i7XcGMQIMu138L90JZcW + 4H80199Hx768Wa4491D9GGIIa4ca0999HI2aCU21a4aii919T5G1XW01GQIogGGW4a4KD0D4 + QTBT0GWai4bQ0M081B9IoQoWJ88dW3KGI26801GMIQw4uWX28GII2YeaaWS2cO@a2A80ZWJY + 1400Gf2HaHY3f@qGe790100e5q3YZSeK7eWmuqjijiL1R0Wssssbb10O6QxpUtY6TfiDRTds + GfliPTBphn64Ycjz1PoBQqsp_4PDj5yTRJcjB5DvhhMdrK78ajAR3TC4EKwiz44IA2is_s68 + 206mssUCC701OFRp6m403ejDhBoG04mwijDGqMT16C000iijP320ejQ2Uxb0ljjDXMh18800 + 813Hq0aaG4WaOWqM6WGJWWL8I40908600G00406n008GH8w081C8W0WGi0000WWH6O2580Wr + 1Y8a50IGcO8WG040H5X5k9Ac8WfH4044aejXX0a49cmsWHYIA4AIRmY01YI84PH3i0f8CLRR + Z09996ijjHeaa4asss2GIIY8RRh699fGhtG0Q3fJGO1GfhZWXef0eWX14W664OIYG4934uQ2 + MaYAXm0W83HG0G1BY0XC0WC0W0Gca4G0M01Wm6M12400J2cWGH0a47Oou00I3249OP08b81F + OROAC9111ijQ10a49I2cgHHI449Asoe1HI2B7QT1Woss2jc0osssGIIIctc0HII2XMh10H0I + tacMKW11HQJRnK40089BCA121W0bc8bL0aG4rgbj5L22GeosK49890OQOB5W408XajH30W4G + gjCJ3IG40uaeD90GG4ONsq600080QAJ28010KQIY@V212JIIG4040FBfG0002WKcqOB8G999 + PZ44e9991200G66400002aaaGerQucZ73Y44eOZhFG02WWeilnj9PGaGaaLv4492W4KfC002 + 00O6q301We0HCvAGm05mNeD8I2412l7OP0G02In0yPW418HvowQ08m0mPowSIG4IYPk@UGGI + 6azjFy839HY4tN_4a4HXwVVyG4aWapRhkWGh90899Xx@@VaaaaWz@@zmII6Qz6OB0JGRJI2a + WWHYff9wWW2DnckCf81WKsIpc493KYMYcqK82JO0IIJQ859iX9DjHq4I0XacKfKo08eYqiXW + 12Y1Ipqs4D88W9JJH44iGWjDfj0C0eGDjj9XK000sqsi112W0JRpq0i0809TRr98000KQRR3 + 0000yjjj26000ass6Qj830mK8T@iw686000kgPZM0Ee9d6698Xg3E8qEMwRcaA2UeRv3IGra + jgLvEtRQV_W51mOpo7sITajOAQoA2E7e0W540H4S0G00WD580GW400GGWFQDevN6UaIY4R8e + u156Cm02W00160Ker5010GY000IE14W000891208W0qEm1v4SGx354zs3G00028uW72I87Y2 + M9OXX5S8d0B2uyYQ0UeEY6c1WXC0Ouc252LqX66IO0W6gfJZE509Q04MgWYw4E8EX2kjuZi7 + M8B39A1OXKAsvyM22BbWUXFuKG3M0tWX6Mu702IUuWtVT00G0IL56KT03n9CIFSbaJW1xaPG + E1Q8G608dWB4180aJm5XMlJD38GG00O4W4odOXHBOucH2s4eXgLA9TiEomGZs4K0100W00GW + 42G8cZ3s3GY44SOK36MUYWJkJeLzJg10340G0rFQ10P0WQ0O05800000YGNDew42kReWg08O + Z02kFvWS2MOUW6EwiYCuHvX076e9br0C040GGR7Daov1JqxIV7O0G08utF9_7MXr1C0G00GQ + u4a9G3VaY0520WW1Q8d050200Kg03PO4JP2Ei5H18W00YK020100x2KGg27G0808zx30a0W6 + t81P9mG606ihJGt6EHhAF0J000400W080Yn1COXM4YVmYwGO83GI2C040220fEG18G0Wf2AG + a00mE07aw029zVGF1ACSW10Y000420KSW2HWJGCIfiKG58000C400qAk2@cKm0080I828k34 + U6m010018000hWjWN4GexRA0409Cok1j1OmE3DyibB2202s0GXS2OeV@3Y4oYp6Meb02YsyX + S28eqW4o9Oau4gu@y4gH2Xz0U8M02spfWY2KOb93wED20100HIIIyLha6z50401G201y2TJh + OGJl8Bil14d40HG0BSp04X0O0408W3ncPiZHQY_Wr5UW020W000WkQA8cXNgDmWyok9qQ4W0 + 02aEq3DOOGuA4G010QLT48040qFn1HJJGL07SCX2HDNGUpBK3H1XlkmnjEq0q90302IYdY42 + AOn060880q2W1400WVRW1060GHIVG804aSp1B4WmB4DCL01twPHg3QK3m3@1S0W20WT0WW80 + 0Gr1PKaW12440Q3wY_hKOY082rvYIJBWceW48989IIM084Cb8991HQ0mYaba82Io2baaW091 + 80GIMYaeC5fC98I2IG4aai8G12Waab8991HGIIGwZ4GIIG2aa448999IGI20989xYa09191J + fM0JGIGa4XW8919HQ2a4Qj1KII2ILTYGhl0918eIHGIeaa4r0GW48aCA1090III2Vj01O9fv + 4G08981JIIMib448091bsQ1IW4WY0mWoPPWW4aKE14qwQ271Km4t48A99fww2g1m0B991r0S + Gerna6o39LKH@2JSnn1rjCHXxFatr5fESHuB6CCH13Qp0G0IYVCSej04k68XD1K8M93M8OXI + 1IebbcA5bWk18Ogh3AjQXPOoOaD2ECXX_BE0100GfJIS7o6RF9IE17i704jydm11H8000iLW + CkJueW1cOOB9YBmWIXJeh07gamY6ELfu0A2GmW1cC87kCE6uWs3VO237wNZWiVU2PR1PX75a + 8I15US089BBIIIYC991GIII2Waaa1998IIoMaWaa098OLIIIYa481IQ2Ier4GM2Iw@32G3II + YWWaTvQ2a099GJIIgjQ98899a6DD8RB9HIMIM3G1iaiag1uWS2AeJ040911HIIIAd02GIGog + a4a089GYaaa4D990v4SGO@588P9HIIIQm9BKGW1GGII2jsdmmIus8A6jOXz6CeUc36T2e01W + 8r1AOjTlBPRDJGc_5ljl4FHQhmctsrzfTPwARn@wHZoIZDowtaee9Zvxxhebcl6sldCPVSCC + MMMyOA24Gssgj1E049BhMsH4818jQRRH4GKAwjzj0r4mWqjjD3@A00MosiXB801ERpsYW2W1 + yFRR32XMR0000Otss6XMR0X0000ossXMl10000G9GAq4000aaC9Z40ZGG0Y5KG0X01u2m011 + 04OxuG008G0W000308008XW900GG20476CWc6i10GW49AIIfAOM3COIR040C00iCbO0WWC41 + jXX1ca860sYHqGY468Qo2h9IIWeOJ34899iy9w409994Qj229992jM3f0X0EX4W0j0qWM00a + WGG01021GY1C08C410e4OAG2GQ804e80GbWW1I22c000W28G1I00330G2Ic42Ia40fbt01HJ + 1449AH499BA4AyJm402CqiXf0a44KPqY50AIc0vPs689HH4XP3Z0W98iDRRhG9994ijj5Waa + aGsss6QIIYOPRxF288qQD0202ucsocA001IQPRo2200Aej9R0H0Wecc5bIWW08Ijbe00220L + M6M899e09HPhWW401jfj21428GD9HJ00248s4jj10000JciaW88109I3I1010WAQIwbr8GRJ + Q20400ej9DDwGW4D91W000XMV0aaaaGhDe602S9994Qj6_CHC0C020o_2ta0102UIVdw208G + 8brgE80K4s5gVI20b24hAg3GGOG8PuW0951002HB7020CGO_u7GI4aijOT30H00acvT34e99 + eoIr2e4i4O5_t7eWa0PewVF20IWul_TF10HGelslF8589vwsgHmZba496@@Gh90y@@l7GIoG + ht0HhJhIpIIWajWIej9HcmIg5sc294J8dyQIocOQGqmIabyYOHHRGIJJ299D48jD9YqYMeqa + aeX24Oi228M06Ymqc45H1W0nRRs6e8I0efPR2C00AALRRB0X14G9fDDG202GrscAS312GRJh + M0100KJR@NKWsssci58mss6KerZC0mJTHpKzPjW100uV0O2rZa542BUeBo9udEZyeog7A2bX + zvqODW3_ZPYi6NvA08ESBXP18eIc2Ubz1I0080008JsYXk2GOzo6QB0XZ0Auo9UG000CQZ2T + aIGj048002e2q2MPW010003DYmMN50I0Wu4X34000aJG1LFYGf2LaJG5RFqGGTfq204PJImH + 0BCrW20201Y78XRAM8ZX6I7qa1Mj1802G4MF0400G400G80DSAHEf5WIXW7aqv5D1Sm3284u + 810a00wQ8Xv3u8h0T4012CBW1v44Hg08aJW4A0W0o9W0K0W0v40H41Ka2W19_UJt3bi4m1Xb + aHk5da3ACNzTX00mWM0ge002UW5ZGor8DQQUZzW36c8D09U21XS2E87a5MwkWe1SOBW2coGX + Ghl9ol2MHeWP68ezZ80100iam1rvUGiOHKGW232GmNn94MZAXlwHchRqL01G010M9OXi58uK + 2L81014QzFzBqm018CkA1@4WmkiHyX4OzHoGMnFK0j2FMRmBp5SyA1d1OGD19qT610W00kF8 + XA7W0W04mG1xe00Gu@c6w5y1W100W004QB01G0H0v4am53AW200OVEC0e40iJG83HW2W000m + W00H0KGuG44aG1040WI4mWu1E8uX6cIm00200ZJJmq3DG000P_18I92cs2I8u04k70XS28OU + W3sbOZS2IeG02Y2WWi0IOYWKsMFe7pTeqdbwvWZg6Guk49cVkY35Su_Y340204QjKr0mGI1E + KZG4hz0Hf0FCpmEt1CI71FCaW1W000ogXXd_D00G8mi0CSfm19AOGQ7CC0WFI0W0UJ0Yt18G + 20GmyA80a000020qk5C8180u_0A6mcWe2C8v45Ys8Y6WS1W41mE1AyHG1G0000800ibc4TvW + mT26qF02G400Av8X6XPW0G0GZCVqIG2XJCot19ad81BlZmf34aXW3bnemOwC0410eqDM2jM4 + 89B9IMoKcTb0oIMIaa0bP9P11IIocbaauxf48191Gw22Waja489DfmIII444W89P9H20a099 + R9I20JiWWa88905QT12MIGaa4481QIAYL4gJD11819jLhGggN4QD6IIsIqq4eK3028G99h1e + 02IIY899fLII60aaba1919IIIJWmWa89899IIIMEB1H3K0aiaWcQ9WcaW4989OJI2IWWa4Y6 + W0989854e0899eS2I8yLQAL8YUhJeXX22Xf21010r04Hf36Ktm1W000EWuWc0I89fQ8080qo + I58010k7MXj9IuO03QZoYghUuKiDsytaDvHuo088004qem1H2KmDVUyc41n8emtLT4FFBF7e + HO06W100u5h20800yAG1@eIGRVHqHG1NnLGAX4KIq1x8SIPCdCPbD92DKm9SaXW131ym0S40 + 4208dzEgcyWa4s0Y02GE1tWa4Yim330GIIYiaakm35a819LTD10898hhb00998jV01OIII5c + aa019OJnlWi08019GID04GGG2gAa2aW4q4S21jOJGY8sK3012IIKaaa48P99h6W20o0IYaia + 489IYaa44BB98QII2qaaae9999dQ2oAX0bb09IIIIaiaW899BQK028B98HoI2gjQ9UvcWS28 + 8qwUAZ8aU0U8022YQ0XSEA0800Ou4LHg3_I_oMg9fZPI@hxopda8EblvFxSckUIkikQVqa1M + yjrX9on2pspp00k92wBRFYcek0ijkS37c1eal5RJI208sUlj0HQ88Un_sYgx10KBPx3D402P + RRB66G00izjR30JW0qsczbbFW2OBso642jU6WY60GWGdaG23008Bm000180X00ZG088o488C + 000W1606112G08ImW0890AXX3420f8GJGk80450Pm5WA14aaj01Wa8GXqs2W1GI00GR30Q89 + 0APB3999J4aiTRr4eDef5Ym40X6m2DG6oWmss2j61III22RRR3j_0baa4XMhXWYH272a000e + 05380XI884C4W98G4GXWYGe0Go4e410a90ZM6G0Y0W40CGOOH8241feG8SX02F8f6A08QAa0 + QhXMW99120D1Z2W09JJ6882I0Q2tsKGHI223QYYe41IW5C1Z7c88Y8id11ma4scjjLGerC09 + 99HijjTerU0qWam5Df5522GW2KKiC0W1IQPIo0249Oj5JHb418TjgRBGWa04gjiC182H2Msc + G10882QIHX0f00WQGpc2W208e1OI32004YC1910G00Yqc402G00bqcq04000OBJW460008fB + 2202W4aqCD102jc10000GJIII9X0JII2XMh1Fm9SW2IWYprvqHBA24adG7684I0JE3L1WWe0 + 8eK80010bKbn300442T59c020P0aK7X1aeG9IrlF1i001QqsVHmCa0ZHUFH1oI2bfu@1909F + cl_@1D09Gc@_d30XC9YJVzJIGa5e5zb3902IkFqw4SIIIO@@@7199PerXW119LDfD9naa6Cs + ac8RPHq4IJpagi1II99IQC1QHIDwIJ148i9AjvfnsqY0acq613GG0UQIq3G9HKIxZq04910C + 9JRYK898c8jj11204oiqs20602rcsc4BRG4GJQp61C02SDDR3aK00akef50QhkWGhF02000s + sssGhnAJhH_fxecd59VkGAEHZuZv9Q0DAAAZg2cuJ75Itn120e0P4qpno6G00GO0H20222yI + 010I00QAW0m000P5GmXq6q0G18W01UTuWcEF0800mCp50G0HesA9_fgWZaB8pWC60u481001 + AyGH2B04048DX2cppWufEO9132er00980p3eGPL9K401bo6HdDwavm2v4y0800WS2KG0G002 + 02WY088d082Xu10b00XwKJge6W2GGueC50GG2K501444040000G2GOZ02GG2W08000814JB3 + BW0W4820284000000GKG0mn0M0480uL3I2@Oc91K08000100W60C8JW680008800uIN2owWX + u4KOcBUc0ZWsIK8_D3W44200W0g0a7_DZWxFDeSX3kI0X82Cu7W2k3v9G480dVkGE160104e + n22400GaJG3laYG607KY02v4qG9ZsawW5Z6MGmmFq9W3l1SGAY6K302fDCnM56qPwDv4K1G2 + 2WP9KuNW2020IK5W1P4G0810fSJCOX320I22CB21fzMGumAac@2@mQGICDa6D5J40He1Ny21 + 4z9mGO16KHG1j6K18000100AB1Oml4zaJW62000c6j11400r7SW010WQ2Muyu3gvqWqTg080 + GGy85qTZ5bQ@H55X48m15FSGd08SOY1XTmGq0D4L01ReKGX08iWZ1h2GmI16quO375CHMZQC + Yu2bue04000400WP9SmKEGG0008kq60000SxW13zqm0021140PU26cjeWn6AeCc2IKDXFAQO + pF4_LWWghFuWfL60852W000200ILzX60CO504G002azG3200G_2OXS2GO4b2IrmX87JOAZ6U + dmYK7k022AmU4E4y_2r0K0C00Wy0EeV026HgWicM8RW280W0qE02bXZGS29admE1zIGR1BaJ + m17ZmGFFEaJ04nNPHF2BaJG9n9Knl0AC4K4bNEnv07K3G10100U7WWt0O8WBdM6mWs2G8a13 + W040CR06x3C1W00Y0EzQ_0j26Te3Y8OH13_X0YQjIuHY6MCmW9fF8MY4c_1am9Z9L82M3e08 + 00GfLUmxH90000480Wmt38akI1vjNG@B5C@31v0G00H0WMO9el55MUGXF4Guo024800aPs5d + 6S1a00eul8u9Q5smX15000L7e0011Wk1KGW0GGN28ym15f0aGoE4aw0F8000o_9XrDKuz526 + 3814G00JNLG8NCayB2HLqGsF5aB5I88991IMoMQg18g09nYo2YWWa09PP9IIe49118oIIGac + a48991H0IG2aaX41109DFI0KGIoQe9WI2IWia441889GIMI4a0C4_w1TIJGuh6Kdg121II2j + E79eP9I2IKaaq6K3014a5b8111H3IxYaaaeRIIIXa4aT2GmY05aHR2081Mo7e0We4a8809Z6 + 012oIIPqYG1150999f6W3o98XmNbvqd2wJIZujWuclG23Zf9AS8zD6Um0X7wCO203I1WWMVU + eF488000L5N2T45K4H4eG00O0020600yRG4V5eGu07yhc39jjGd2OqQ29n9W1808W@0EOuWB + c3WYh0I8dW7AZXha1SOuQCg88gGTuOX09cHeWB198QeD2kqWijn29P1PX7401f9em35e19PH + I2I419vPEr44Qj1IJIIQ@W0G0GIaaa0Q@W05998YII2a4aa8DB91IIIYW5aaQ0GGII2YbaaW + dGCeNa2GI2I6QzDoGGIaabf4QD1aei0899AXIG2ARR3GIIMYiaa40999YMIoWJAW4a4Kd078 + 199vi528919j701v4K0D19f22K8d03A80XujB8qwf6TGXrPvwNWB8AJXhBFTJaiY7jjk5VLm + eW4_wbzDvHuBxn_oVBOKADtU_eSvjXSzPRWxK17tir5nZNQ6pJti1KEfINNg_fjHG2Rh_s88 + WH2yux914cL0gjbj1XK0WajjD30400sMsiX0801URpsY0001izsgN0msscD00Wsg9ujN32jU + 3G4Y2G4sOeG03W0K822eX71805ge40e02W0410We0W66841004OWm08W18B0I4h305000X90 + 8i0CnZCCO9a0e110W00OHYIIXJmM4A2QZW0298JQB3B09HijiDZay49ysmi5I2aWGRnc68fj + Q4UY_WsgDWORRh699fGht02u0XP22208G0W9X88fW2g0440988X86G06A29KWW0mG4YG1RG0 + 11834419405800Iae82m00DsKGXWW00GJWa006qa1eWs8G8HY508Qaj811R9QRA9191jTiPX + aa49qMcb1IQ44Poso89Qhk0baaaWsssg1WWf2Q8qQDGG2GPqmYc2100IJPQYYaW8e15PB0IW + We4cXjG04IeIiXX8GG20nIcq07180PRBg0WK08CiiQ1W40IeeHH0GX20aa1D90200366s08W + 00PQQI0000WQIIwcA8GIJIIFK4GQo20W0049C9XGhLGIIIIhr64QD1bNOGerNO6RL45Ce0Gv + QIJG42ee2_CkOH1WmOKEua1O04B5BF82uOe4Tm48OX6mGGF340e2GvG9A2320mTavRAEGKY6 + iQRq4S1XVwyRmWX1m3IMV022IYzN@V0II2a@d@v898HY@ltzaa09XUF@@GoWaa@3jEXsgD09 + 99Per489999qQDKcmagacq6OOJh4RIJa511G3jfGRbaIDys4D9ca8bj4f9DGY6W2aaqaOOA3 + 12QIZeBf4199fQ9C0OGDDHAX02X2s6jf1QqK2QqaaWGJH0HMJR11G0XIRRR20800iDjP30G0 + 0osajXG200QxsgTu@22msss6d01r0yGer05WlGXMpJYkfqSD63uqGVTw04000e00mcFTSvL5 + 3zEqCBq4E03P0SmE09SQj1VB0HJ07amW41@Ymxt_CQr1dDmW000Ga1009vfG8ND8X00uVg90 + 200yHh1T1SGg17Kj46v4KosXAy8G2DVJ0091WS2EeQ02o2pXS2aus03o9ucG47f5WCG080aI + G1@MXrbGny5I2LMRGI6ACez3jqdnUH1LG01jBSn_t4qGn18W00UHlWM2Q0800oGfBaHc530q + Jer4aJWA7ZqmTaJ42m3v4iGGTqyrR1z0K180WWYmU8nWAG8004HW2nAymH7eqtt6pjJGPpLy + 5w598emIBGK3G57YRGvVmySm182G0UiHYwGA8lQ4QusWN0AeoX8MFWXQ0E8MQ2w8C84WG000 + G2_b0Xb488dW3s8eW72KGW00m4n6ioX1FcGGOwJamm19YaK554S3W1BAKGY3ACfQ3948HAHM + 45W3zYmG66q4dy10140o9eWm1QOTx3QKzWc6H0800GQ7608O0uG0380I0ygqL400G6C0XdDK + 0W000W00XINDOg040400zsX3n@zG72FS702L7LnB1ay8n1734Hk3A8002u82LkCGXVRQfG6D + 24HXZ2C0GG0GW86yKx1Btk0G9000W00LmgmZ1AqCQ115amol7KjZG9LhGE1ESyW2dHaGg74a + J03l6GGE1GCwB1v4yIS2MSl06vhGGP04e800OBW5Ybg08W00Td2Hx4PyyUGj54HjGH8040ud + eA2uaiMBe0110m00Dy652jWaoHIhS507tBOGuh4azm5x1ams94S2tP04W08020a2D202W0_u + oWB090918mM28880Oum040C0GENW1@7rGd65Kt54z_AqA2A02G0eO19W000sUo4p4e0400Yb + 3E85W3k18XFio8K7NY9gXglBOX02400GSQ02V3dmL040402eOWCg1eYaa49d0AGOIIs9T1aW + WbAD511BB9wo2Ia91GHmMIYWWa4B88RIG22aC4aD9915ZQ1I0a48P89rMD2o2II2Ij0baaa8 + 9X0aabnK401XlU0OGIomN98qQSk2m0eaa40899HMII245aCd02a10a0HIoYaaa01199M2GI4 + a448P88rHW1a0a40IGI2aaaCQ030IMIY44WCdW28188eaai4899OD05yOT1G2IIQTjXmNZfK + 15IIoW6tFu_d7gTmWO6G8203oVlWZLU85W52j6e71I0G20KX5C4Pn12100Q6XXM0A8P0CoHi + gcsBec02oil10101R0aGFI4CKW14000_uO1W400pPIGUUULxp3j@OGO0KyKJ4nriKP1MqG03 + 7at0e00W0uq8CX4W8004dWLd3G0200W04SW002m6dSqHX1PEenO06Sg0Bv4G1IJm2acaa5UW + 098H9IIQOaaej0919gaa6CHa28B19HIIOYa2W499182GG2aa44ggs0W4W6TvN0FD192IIG4a + aa8898q3Y1LXW0891egGU8H4NGG2MM301GII2g1O1ajba89nIQhcWS280098PO@CWc48fJ02 + 8189H22IYaaa4B91fghDWWaaG11F04WaCuaV2dGYH9K8qQ6Yd3a@Sa0180Gg3yO2QGK__ske + Zz1JBRTsYdri3bbPhR2YZq_cdjR2s7K_ibjXHPI2pts_0l8fDARVR2kWoAiij9ZKWZZiz5Bp + 52rMIMrj10SA1QL__Y84F1sRFRZ71019RRR645W1iblf30H06yscj51P06OVoU602jU6W6GG + G002i034Z8AO4001821X70h42W03GXb042150o0n01KW080I8808GG039004We0mi60F0j01 + JW42AG649X4mb08J4wY140I0Q12109A803R33AC9G45j1ZaX4AGMq45I2aWGJm668XIMORer + p884Bsa1C70EI0uW0W0LG34A6I104G0QYaD0Q0O0GIWA0QH0a08W0e5XI4q06mo0WQKOGAQ3 + WGZGYeI03YW8WGI0931GY408aDW41WL4CG40cWeiDC1aaa0pYMeOIG24Q7po019AYCKROaW8 + 1Xj3jc680u12RB54aXWgfjB512IYsqcK0C08W2QPr80W8WYRoqY04D0i8JA2I0W4si5D1G0I + Goscs2I080r4s_0b001OJBYaa4WBCf1J20G00Gaaf50000re9f10000WqWK408018JII2jc0 + 2Q23XMJ3r7QFmo0WWXXim180GYqp0q240927JJkn2804Ubacm04KWmA1U0KGY27yF000G11M + tGg0GW040_5b1a108GI_o0G0b4aAMe1HmG2jlgv9EH80ih@v1889G_l@tZ4i4A_BUZZGIa4u + @y@3P1oG_FqwPmWKoeasy5OG2Z0JROsb1SGYv9PJbsgWeaaffcYfXi7vf9Gcaq2bscq8IP02 + IJIheW513P9zI18b8JjDHIXYc10a69jH2aM0Racme1Gn9HRJQ131GHer40H03GJRJZ58W0ij + jf2W0W4qsqA5008qQTM4wZV0SO4cBUDJgI1MuZ48M7PXJVwgPNY6A0dH5sPybAG002qAm128 + 00YVeYo1cuuv460me3tAuX02G2W0qdd2V4WWW0000G02FRIG6180180uf02G002a301Y0008 + 104aGq4F8sGerw020WW100Gca7ylS3v4Km@d4Kcm2v4GW0002C0W0XSVmL2AaK03v40pt2L4 + FG1r0yGi4O4302P3KHiFHK8PBv4S1800YL1Ym000mE05qGm4Fg_GS29aJW3fESKa0744D1W0 + 04somYU188Kf3U8WXk3EOYM2QIGYI2EuVDV0204aJG2JUSHE1G4In1v4CHWNASgx1f2aGYlq + qz05H4WGe0D4mv2r0Smf4Jagm1Vb2JMZPC9G3rTVnK8FKvC2LMMKD0XG000Ol08cuaW1AeOr + N3Y9GXyjAOAW34W20aDW2@5gG0dvG0208uM34040aCm1pgGmET4G0GGu6c4E48XCHDO_29Ij + 932800fESpYm88200Of17AZYW7rD82a5Iyj01020fuknR064r14POGpR5RaZm20204s6mWCF + Se5_A08004UW1Z@bGJGr02000A00Gh1L8000uKW568uWQXP8302Y9mXe7Oe602Y8_X49XfEW + 2Qj7Xv6I8J12wAuWK2F8aW4K000y4n7DfyGE1b4YO6Jx7H028CGK2nFemJ0741h2jNYGl35K + si171um7M_0220O4cBcYHYS2o8eW2g_rW8mFAx53010WLDW1nOim57B0100Ppo9_4mWM4Gex + Y9IKm00100r9eJX75S5K52000U5uX22OeB14_56XSme2400GTLKC66Aj6OGQ09a931v4a4G0 + 2YNJi0G00mS24yvW1nAumG05G004ujWDsrlXK7uPpo3M0eWs4MG00KHvG9W800W000W0100A + 020dsOGi4C4GW2LAfGCpjC0m522002K@Ym9CW0000G00mv4G8h920G01CsY1lC0X180We1W8 + zgJg2930GG272lm7K4aqH2xuRGyK4a2N2H2m0G2WW726fwW42rn5eCa489H9X2GYoWaa4P19 + Pff48099HMIIY4B912I2I4Caa882xHI2I0ikW489D8H2IIcaa40YIIWbaa4e8892II2aeSW8 + 3913Ir0ak09TfI0P1P8IIG2FMN0aaa41BA9IMII2jk6eiacA881XIIoYWaa0P9e83LIoQ0EG + Yrq4939122JIaaXa891fH6KGY4444D8992II38P99L2GI2aaq419992UMIa14WhpIWaaqb22 + GmIJImy060999HWoIYamWaGh1AqY3YlYXc6MW400O978Cu11xRyGO3AqRrDXJKnsF4W001O6 + Y4G0G0C0m58300g21YOsC8H74s7OYfAA83HT01G0qMW58W00wKeYk0A0X08mRRP4I0D54Gnn + sEShX3v4OGAN5iKW28808kM910180Z@IHE1C4d0F17TGPPEiLW3fLfHD06S3N3TvXJT3MCC0 + 1X8_nlK64O038000A8uWx0CeEl8s2GX1co8dWGGIMW2aa4imZ3iaa4Kun10aa4GIYIq_H1Wa + WW8999HOGG2aa44980fm_9eGw202II62o10I2I4Kaa42I1OIIIg2n01199IQIIgFX0A2IIaW + a4I4X6aabi8991XIGIdJW18H193E11aai480995IJIYeabynQ2Wb4aq903i5aa8919HGGG2a + aW19P88IRIIiii4_7mWQ08WIIMI9t4OII2AqQcoPWXxg6H020Gz39KJ53vNzIg3KmUH@2J_M + gfTv3Rxv9sg4r0B_bvFJ6baGMd_jtRay1xilqf9M02pMttH7S8FCRvFY0i_OiziOH6cwfijL + P3E6kRUMiaW90QJQrst2Xe95axx@ZX901PxRRcm400ijlP3HL06qMcjb1H03ORos602jU60y + 0WW4AaWW0010OGJ00401eW19h0M0X2KiG6880WW00k502GY0G4G00P80GAn02eC8GGsC8O4D + 90Y0WG0664W06gCD2I6b08G224P2WZ200103O33809Ge9jDZ4W49mKqC5GCaW0Hn669XIIOR + erp010em8050WmGMyIKW04mA868IGWCH606900QW829LWGL0nab110888GYn0004420YOAKQ + 32WmGGIa822W08j8L0C220aG19oe94HXW00200IYCWjCn0aq0MYseOGGo499po0592Yk4RTm + c8XXj3jU60004cDfjWI2IYaqocj801GAORI60W00g59HBC0C9YLAR9Ya40Gj5b1AG20GsqGA + 001HIQOgK0480MJIq62a0D0CPxR0005Y6DT9800YIoW260020ecoa68C180I2o0P90JQIc0a + 0009f9nMGGernucd451a081j6DGIX00uwYzjQ0W4WuoBz05I1C4PaE182G0GByC005XXu1t3 + 4Gm40j71C8O8GW9v0609L0YNg54CK00GQsM625KamQVdBWmYE2Vl@V0YG2aCm@u89BHY_ctz + W4491FH@_GIWaa@3jU6b1j8AfC99Iu48WWbaTx9g6GQQqSa9QAlfHRgX0JIRGJN281X5Hjhl + DaYmsWqcc82J02GIJZ6OG0KLQRcMe0OIX9HpIKWX0Waf5DGYmNGqsd0Gq2Geqssa002W0QRR + q4W00WDfPR0220WaFqQSYhNbxblw2vLAA9Xr2CQ00VIk4ZoPJ8uc46CWXf4Ce8W2o62X0Lau + t0X88104UK1d3K0O000000W8485_7WWGVA0G2GHo050444e2f2800020WW09100200WS2A8U + 842HYXU2FuaMO60u2a008nmrG414K2m1p6UGFD54e52K204AE6Y_QEOq03M9mek1EeiX4wPW + WS2Auen4W0000I000G20KHEB0900uAk4M9m00B00ZEeJeEK0G028eE2Enp0WKW4BFOmPK6it + d1F8K0I20ml0C8H028001LTs2pWN0GIGoeEL8v138008rwmABFvnY0804808Lm6kpDXmfWuk + M2Qh_eO20fk046Im020207OnGRl6Ci01Z0O0800nyXB8a02gH8Xr@SW080m56290008R22o9 + OYEQL8d0560m0H002bWdGE1E800We303O020K2y39_EJD07SAW1ZbV0404WE1M8rX6s0e0X0 + 00TGy020WWk8DuIrM2de3G020G0200A80iwc1F0O0G80aC4M0W10W0G1Wp280G0OGZ04G2G0 + OcY3g0WWd9EWW00Kf14yfW1B6OGJ66yUG2fHRpeoAqcc2X2S0800earA0IW0GX97C902xDam + GRMym027PeGE1nqlV1bASmH0BSwG1G9002d331200R9YGR68aJm1f1OGQ7nagw524002DkWV + 08u0q4c1W0X4400400l3uXR5CeDK2AxuWS28G420oHGYaXnC018GgIu08002b7KGG17Cwh1v + 4GmuBDyde1W000UYX08004X9OG39E080WOGX4UrmW10qvHb34200KAH10500oIeXML98503Y + wuW@_OOHc2000KC6m1@0GGnF75s@1RwOW00002100000OkE8XI2IuB38QbGXS2E8AJ660eXw + QA8SYQ6qfWHCCerX2I8mWr1AeAa3W009yP05tgVGVI6ijE2HwjmB69C0mFVAQmMwDC003xcM + mM7EaJG2Jm7HPwt4Ha5@2KGz1501G0yQ52k5eXpSNurd8W000SZW2x2emP0Myf3E@hhIdvDK + tkF99XID0OCWm2P84HQfEqH3D54CIFe5KG03juKmt094l14X0S0100YdIt95VJMim0010GxP + hGY19KPj1d4SmSf7S4W120010810zMa1jhXmQt6auxDr0W120YWgqHezx3c5HXB2A8TZ6080 + 0yVV1V0SGwA8yqn11tjG53AK7s8Xzd1088WwDCued8cxWWP3O8mX38G00KuK2f1GW401W0r5 + 9KdOGIoI2bai480992II2ibaaXlIW04W4HO99IWbXC319H2GI6a4W419992G0Mabi199995Q + D1M6mI444W8819GI2IIGg7G06IYa4a0IIoI5aaa0999GGsIMZA1jL3HerkWaa5K9918KGOoG + h9GIHHJD05mqCa69DoYX4f01918IUI204aa8fD99ER2e9991III193B92222Waaa8C91Z601 + 2YIIamW4GIIMYaa4iWW20999rwg4XMdp9CI804G8EuBA59YPzJ8qQc_18XsBO8k78kumWsUM + 8dW3UFcWp1WOcm2cXpeosBWX00m61BCOZ133eGOU6yrX2v2oGF04q@d2dta0004WBuJ8V5TE + 4WWY6Ku8d2k1hWdLQ8J15M6nXM1C8VJlQBGY7XY8f4BUGgeGT0PP09w9eWLYSe9W3YI0XSCK + O49EAdmaWJk09191K2II44ca8A99ByW01B99oIGI4899HGG2Y4Wc49981G2IIeaFaozWW2G8 + G24a41989G22ICaWa219XDHAG0aaqI04K5Y6XM@oMr5K3G1abiag1W0a5ia89B9HGYaq9G2M + IIIaabi1991fJW3Uwd09198IYI2Waaa899912IIJD040IIIe302qaaWKGG2GJII2jMgxZse8 + K4Y3G10500fcuHeEtGGwo2sswZ1SbBIxTh_YqYT9jjBT3qnyLMZzaRJKsFsijb0j2SFRxMMX + j10DQRRVpjJqOqczvX@HRlaa5DpA2ySoMly09GW2_z_xYeHfFMRvh3h9X0DRRRco6X4ijtPZ + IQ32uscj51T62ORQs602jU6KW0W00omXx0108G0289W10024IWIG80Iq0C300C0G0cW913I0 + 9qGM6G29X000C10WD0Wj10G0W502f1I3W2C0WJW8C2mm2280WG0GHY00O02020B32C8Ge0a9 + 3a059W0aabG2WWG10c68mMIORerp8D9Wn9fW8e0W2q4024LI206I91WK108hD09G49QQHaQ0 + 00K0542WD404c00IWqmMsA0W4m614f0800G4Y404442002828H9eW8F0088X01985M8ePOWX + 0AB0W01122iCG4WW0K8M6P3GQ8qQQ020GwacI62041IIPBo2aG09B9OPG0XaiKcXj204aeNT + fjW6022noss00100JQVf0WY00bCZAX428OjDPP02Y20d6eb902Q08Y2oW0902GJ3Q1a00XOI + RoVM8GI9I22a004D9D22H00aso4QTDkeT7098IGs@4La6182U0NCOIo014EX1DH060CJP800 + G20ESji22200a4s_1a001uDgY1aG680PQu00G1XiiAo18q24elwIb9EQ244Ybc44i0ubcN7X + 4W41R_VEIgKaOl0TFA8HG0colF4069v@Ghd101RWQRII2WjeIie9H7OYg1sa4fLPhaWIIaaQ + 920qIatcW1RH3GGIIWHXiL8jDTWcaqyabs8X0Y6Lba6951JGsGRsa4j1JACHJIYa08bajf92 + 5i458l9D9mo60msacD3J22GRRs6fCA08fHQA04QTDLVGmeSb4rS4jMRNNEMKOm4fN3MUhD4m + j71T7I4JQC0mDRFZmHVcO000O5M3cyHXy1I0102mF17Kcb3vdlpt1B08W0ODY7800401C0eB + W5G020Sc03h8eGmQD499I2W0WEDYXImDuw65GW2mCTn23SQGH07yYR255GG_RFSJ02fJYG8Y + FbWH3ThMGYm6000GO5X4EUwXoEkfWWCsNWXBe_8d04ITGXS2KO6nCUNeW9Cef1W3Qi8Xp1CW + 0W0o_194d014000MtCXb2Een056OhW_BYesD2_AuWuJkvfX2G0G0aJW404W0p98310G0v4qG + p34K302jpDH1rD4KNBG002AVeWssEeZa8QV7XT1QO3032pRYHIcuCiHosMZ_0KW001mk04SI + d1L7um5c5SFm1bASGK68y701nDSmVaA4b04b@D3820Wq0uORu36Uv111807gJ0801WFRWeJW + 3080088008i02kitWS2gPjr9ghu28000RlGHSlAqet1lx81GO0WK7g9d05c7mWt0B8wP60C0 + 0KDy1NY81WG00000WbhRmT180280O96748GGareFppuGvsCqvJ34000o0eWE2HOJF5A1WWXJ + OuJX261eWxQqf_Z3w7012010PPN0000o74F8d4Cgdy0000471G1140WCsLuHISITmWS3IW00 + 2G7aBaB01nfe110Gea5SOu03014WaeW3fESGeEtCAn2BvJmttAS2G1I02069O1400020004W + WGa0H2z4G0W000W0004040M6uWhpFOqM32QtWUhkfN53o90XHfW8d094001y@D1hESmjADyG + 018800o9GXQeC9qQBU8OXS8Q0a40m91CKlY1bJMG167KE23r1Sm2yE4TA2vbgJerDiT83t8f + ms4LydV2bRjJWJh4dG33RK1G20Wwh39dWdkxFX8JWO0W40600K856fIOm505SeGHhEqml544 + Xp2B3K0500WGwA0G08GD04GG0004040101Wf0EOn02O100yWo1LjLGz17Ch04Lx4HDhmKg02 + xefHD064Z01l4G0GW8WH1A08040W00W6kFeY_8g9GXRO4999Dg1OY7288dQ2U5W08008fOWG + 5I8G000SM070800@GW4V_Nmq384QjCMGoIaaa08H99GMGIaaCa4A9092M2I454a8H2IYab44 + 9318G2Goaaac8898III22a4X499HXq0C0891vkg48D0998L20BO9H2GI0PD9fKIIIWjaarfI + 0aaa489BPYII22jE7B9992IIKaia48989IIMI2b4aWmN90aa4OU06KG010IGJa4aaq901Wai + a0988y7010220aWa4aB01WW44e991HMoIY4aW0mIIIWWaav4G00aa49899GIGI4baa81919q + wWUhGX76EuVYAo2W0W400VvZHT37qco2PEWGIIpCG02XWSmq07y0m10480m008SLG1fEPmNE + 80304OCA3oluWX@MuE03g8uWGhvvM03G800EB034X000000G100e805YDG11200pMhmi16CU + z1G00WY5O1200GtDlI6Zcq@e5xwuG2p_K6JHd7GHXr9LG09T1HGD0ESW13bEKmu34abW13Fi + mNJ4iG21P9OKm9LKun1aWWeAyG14WbW88HG0Waa8990n22IWWWW0199D0I2I0Wab0908H24Z + C99D8I0GHaaWqC999JII0Yaa45Gf91GIG2899DH22IM5I10aabg2119899XMRJD098898JII + I25aaaQ0A8qw3888Br9G31gGW48BPIMGIH3O0989PII0Iacae8B99HJIIeWW6o98XGh5gLX3 + IDPYm5Qeh4DgAjdK7eW0CfkylsC1IGxks_taapTIJAvLttWjDfi5P@dL4ffsPxRJp0a7cj@b + XUGN3OsMsaDy7POR9xc9d4HOBhsc04ejyjUR33qq0qwjj53oGG8sos6En26GsoMCff4qMD18 + 4D0mRVxJ6q6ijw62jU5m2I0GGaCeHQI0800WEXO40098AXq080Im8W0Wg01mYa460K200GIm + 00820H35290DW12We110W4920101qcC9G0Ya0G30G200HI0JO8W2O840BG33BO9I09a53a04 + 94oai50IWaGJWc601GGORerp8GW0q1C0584W0qa0I0L20ska08IJ2GHI8H8WOWa01Im08X01 + a813JcAC40i111WX04G60HWq4a5n40o0G20m0IG0088HI41CO30K91aa8D58ePP5Gf9124il + WWIq4G6mq0B02491Om0DWfjQ22jE600MWkWbif0G0Wq4Waj0842IRAo20400BfPAf0011YGQ + H70004GDbiDI1GGGscs8W000IJQ36010GMJRy44001181IQG00Wm4ij90JI0mcqqM02I0ecs + a608000JQJa0YK00i1HGG0m0Waa990Gerpu@Ab0e190OoLIIGsI0eDQDd18YWmU4vpa08IuN + r7Df8G1Hq@L40692WnJO9402G0vfz209W5YbjP101GGJtkb5y4B9GucsIGS0WW18uR0IG00B + BzV02G2ajkzzW90HYdQq@CW5P1SJuyGIWaa@3jU6CjfDgD9916aWAnsc4P83hqOIHqK1m0Rg + DHIgDHO8BHRQEcWjf1ff994I4cWaqyAQGPIGIJgK88BIGQQcK80HIWjRRV6aaaWcDD9Q40oI + qcc7qK0GWqcqa82B00RJQqe49GW9jPR0WA8Wccfj0Geruq027d3_mH074eO230KvfQWSkMKX + e0HF29Cs84n9OnIT0r@TC11qHM0IK204N0H0480WFhnf5166LhWW1WeVe2MHWW_B9W0W000H + 0mX@C0eA0GQj5qs91NMYmU26ahB212Omm3v0G008s05YlLXHeT0W00oa48iKG1v4O0GG0WIu + EOD020300yK21W004400aiFnBrAW1W0WWU0K8op7cceXk7oeZI50H04C@56fSnqBvCK2G4n9 + KGc_DaJm1P3KHg3vCpm1n9qGH2LKCW5f9G001WY@0C0200Gd3EKC03nSOJg3Bqt03Tv@GE1J + KNR190G0880WS2CG0a0mI3NauxDv4mGn45i063h7mnUaJKOG3PrrGdQr0410e60BU9uWloQu + sK5258XP1OG000n90AiWH39NIJD06q9y1N4OGRE8qoH6PUTGZ7Cyyd1XqNmW5DK2@4v4WoF4 + 5W000wx39UM0YfXjOxo340040W000W80mx5t4mf7x5uW000XBEW8j16sBrWUDDO426W0014N + d175CHer@q2y1Lb_G75MCGG1A001_FO22040rdS0810WQLsvDW96Eu24008z0eG5C6C_25f0 + qGE1_49v11kQW004YV1Y02200010W8ZF8Tm3sLe0a000NyqmMTzy8G5@QK0O00008808040g + WiY5CeuCQ2AcsWW98eQX4E902K000ZNUGIvvavY1v5GGzYl02GWOaY6o90YetX8xdRkLTYXN + Oe_07EfmXIpNuAZ5Qmwes2W8406gKGYdMMuvYHYB5eSG3vsYDwfHX6ur8m9Z26WWg3g0W00m + G1DCVY1W008kROYb2COE4UsbTX1080Y50nZ1G80G0AAZ22Ow028W09OhGs57a6G1G100oMuX + BjCuSY3oS6XiViPzP3g3wZqNEecZ2QndWO4Me@a202I00020GW40mf06KuT1fEqJj16KR21n + Q0Hk07at12h5O0110eQ7Keft204W0a4010Y00IomXGT6wuK3acIIYXaa4P199IKoIa4Wa89B + 9HMYaqWQ2lIJ09819IIImaWbY8999WW0a4B919G22I4aWW891PG8IIYaW4489P9IIW4099DI + IIG0ia4Kdw14aaW8199HoIM8qwQacab899HpIJo0Wa489f99XlI0f99BIIIY89DDLIII2caa + a1999IIIIcWaa89O8nIIGYWCefJ02O9C9HI2IYY4aaP919GKIGH3KWC89f22Ae7x2o9u018D + 9IIHI2jsdo588m584000G0028e1FESWX_aI8r1Z27sYPaSOt49W000W001ubb3grhWQAAW8G + 0m31D0200uOF3MzB7G0G0j5iHMDDO000OiW8c0uWaQie904o_9au4_OME4Y4mW60AW0W0G2u + 6qVm2G200FHeWZ6We56UA@JfNX6PL07IWBd6sNu0X68020Khf4x8uGL3GqKpEXMp19909IIM + Iqa4XAy019IIGjVWWWaW4D999fuNGZj4812IWaaa4B19fsF8G999P88Ce999HII2MQ04GIII + YcaW49998QGIIfuVJX048PBHf6W2mMIIY4baK909PE168999HM22Yaaa0PB99T2K0o6Jo908 + 8I52GGIIM301GIIIaqaaKgj3oMMmA8u0JI22aiaW2jceCI29v14A19ZWCa8S2Vuzz53PTPNy + tO5jajMVHoIsXtpjr9en@hVpRofhJx7BptIeAVBceBfFmiia4zkil1UIS5V_VqHGO50tsgzf + WH63xhMsuKW43iQRBHe202gizj1WW0WiljD3Pv00ssoi1Pe01QPps2W400iDVR30XMF3GK01 + GGG8M0e60e58900W4WGo00L808010Ws000a00o0ma0008iZJBZw38GS0820e0G8081ef9i14 + 0W8mc4602Gc0GO96I11GMWWPB3C081i13RZ4089MfWjH44b4amqs2WJIYO3Oh694fGhhHIH2 + e30090984W1a1094404YWY48G0o21A20Q8I0o2000m8A88GOG80Xe00009b0220400200i40 + 3nqWC06Gqb80c4cfGYw01YH2q803a98e0RCPRA19f1DCiP10W49IIajHI244R9moeD1I2R7Q + DDQ0mRqqMA0X40LJQ9h0004Xb1j00GG4HsmwLGIWaro2f598GGOPsI6W010e8RB12444Wi4i + 40K0WI99D023G0WWa6D110GOIQc6Y240ejHG30818A1JJ20a00WGh9040Wa9998200GaMa42 + jc6aAaU04401RHch2G241kdBYTGO24zKo4B1O0053A40GG909LKV08081oKPsHa0W8MHtXI2 + I34_5D_H992MmniEZi811umsU2Y4W0OHpV30GMOylml3oGGYiXyl7918IyrokdKa89iHx@7I + GbayVerpW0WkHfXP9GoHKDaiWCRPnq4QJgagbL0Qjf2Ia9IIIDIRJWeef989991cYs6sqq4H + QQQKQQQaI0GIaIJZqY8108eDQQ2WWC0qiDDHXY46Yqsc2W020qssc4GO10ORJp6W010ifDR3 + 0I10aqjLxGerj4yI3nu4HF08a8o1410GU2uWTX9OLa823v001001rHqWScaHY3f14oG08yQD + F92Wmo1EiiA6R3WJH1v0909OfX2W022C101I20000WX0180000W4898WmN80140mY34qEL18 + 109sJS10Y00DGOmH04axY1XjTGLGAaxWEDKJWW00W318G081G607CGK304008000W00087f2 + EGWWmh8u219c5rWCzG88W2Mg3XMbEPA7A4410yRG2v4mm3e9CHW1W000cJgXS2YG04WGja7y + HB3j6WGeEn0220g60242I0avB1LEKG63D020Gg_A5000WssW204W0EBm022G073Ono6iS@K6 + 32nm0dLCuG2vHyIv07yrbG15G0G01W1ZN8soAIAl0G2G0fdSme244Hi6PY1KFS8aJW4XMlGE + 1DG00YCdW968m01400v4SHGTq8080e6W9MAWW8yGf303cjpWQ0GuK03sQsWm9ovK020819a1 + G1D0G08008IK001OW0810Xg8NeKW9G020a5W1JLK1010aD798voSs5mWR18eBI4Y3GYGkIuf + 53EKlY1V19dWP0K00agw70440Ixr02001HVY01000O000zFSGw47SIG1DrEH_kaKGW68200s + kFXKg98kK4gwKYs2M8PX504008200eqq6QD8Xf2J8hnRgDeW8_oeRW5g84XjNAG000OL0A80 + 00Ojj3o@BXAAE8weOg4yYy180810mH1JSwk2Pw0HI5CaTA3B45qky6i9m18080IqsW6XXG00 + 0G115SCx1Z4KmREBq7G2VRuHu4p0400S7b6gvu0G00G1vU00WaW9hNOTp3MBmWK4muf07U8I + 7W00Wv3WW0000W0G0N7aGE16G00WSmf2Msk1W080v4WGz0Y4QzDl1iHI3ESYp4LDCHYr7jJf + 9DWKGC6FiRM3T4iGZ074KGDXM7JAerSdWDfEinApC04088N74QUdaL0C8kWFY4n640G0W004 + 0200rMD2j0SmI8480010021mlABKxG2r0GGA150108ejwAoAu08000f1eGsFp8G000X00mVz + 7qS02JpGGfBA4qv40208NnOYvnM8iW2IX9bM9m040G0402WTISel15ALvXMuAOx07IIuWx_B + 0012o72O4gJC8911vIoI0b0a41999m2GGaeaiOB891IMIYa49HwIIYWaC09911IYIIaaaW09 + 9PHGIGYWab490G2aiXa89CP1I2IwIr22Ib06MIIaaa40IGIgaaXiEr3WaaaKdQ19nMGerr89 + 9FGII0ID08m6ba490f9IpIIa4eDIUo244cW8199GI20YsaaaE1E04aaGHh5O2GoYa4aIRr4K + TD12ooGaaWWqwg588913VrcjAA86c46SOXaomOnl2g00X2Tc8qQeswaWqd90101u7SB04000 + 2W0mk0F4H12DcCnp7BiFF2Jwepm5BKNc1HkZmd9GqE01F3KmD0A0220e102w7CX62S8W5PYJ + 8ZB180100Gif4iBG3G202c2GYYj8vL7cG000SbTIpHRJeEkiLm601W06LOYlQw9iVDAyW098 + 9PIQIIAyW0IGIMWaa4pzW01918rGN020QmGhD09991I2W45999I2IGqab48f9194a380D9L3 + z2abWag29XdH88qQSg1W0faaa0899LMIIY0bii603GMYaKcT1T2GW4aiaE1A8dw60989nI22 + Y4qa49919IJIG4Wa4o9uYGhzPUe22deZXyp0WG0GJ5QPQIIJs__d9hl9MhhRUYqrn9jb9PVU + LonUkirJAmaLtizt9OWJ2pspsG8DM3ORBDIYec8ijkP3W40WyjNxJxg04sIjl3YwPKAroMI0 + fTOKVRP1W80WSg90H00CxPR30600jLJ0C00GjkjDXMJ3IGIG888900G004510700W00mWD00 + CoG1A4o2IH008H2Y04Q100ePW0C8aWeKmDDMGW0H26I2s4YiOAHa0GGG60m0I0a0OAW5O13Y + 08CG4ai8i5jjXaWa8sKscHIMY4QHRs298IIiXPRZarMD2XMx24W00ZGK0G20GmJ00JK04rHe + 152300GqGGW004T4aX05402CWseY0c4N2YfGQG04Ij090CXm2H986Be1I80aOgGWX55R1kiG + 20W4gG0N032G2sMssK2JI2QHRp2989IiXDRZ4a89sYijHIqMT1XM73IG00dK4mG000GwTRJ6 + 4a41Dj9RN202a5sifK044aXeja4000Iecms69009OQQB50a088jbH30400A8bP680Wff52I2 + 20msq8D0402GBoqS0000KYca4Wsi8maa000009JII0000W85994QDD4SyF19ARGs7drK8002 + AA8Z92G00qzGh530G4kbZdG90a4SjF320P00OdqA24401OdL342WGWu3@_7MY0i89n@68GWo + O3bv10881uksw60L44utz@7aWaKRr4WEaamV_@FIGIosg9GgIIIerq8e3fHjffDHsoI1c6c8 + RREW2JJYagjKJo91IJD8OQIjQQIHCe508jBj1GKc4qqc4HAG34QUMr22OHaQJpsWf0PGe9JQ + 2WC04cyfDHno4GYssq00200rcss40A00ORQp6W1ejw20300PJRR9qwSEoX1G800ZB@IATJb2 + OH30a@83NCx02H0GGSbK47G1040WoUnZJYifC6EAq310100hgbGDHNSQ73rGyGKiEC0mFJZG + G46BCgG1v4imws6CbW1b3a0GG4WYBn8dWNEM0ZiV8eb03Iw0aw4K0180Gy0QSZ59bKjIE1ma + YW1TLSHNREC82F8840o7OXE1GOwY2wCu28001811G61OXnGFOt4f4080y6i1xgIGr1B4YE1v + 4WX081XS2k8eEegeGZK6QuH26wT0YWO0gVPFM18201G0ltcX082Wx0k8EXRALe48000JJSGE + 1JKdW10400g1WXUVFOD02g1uXS24wgDEYQeaKOH0G00GV8Mq8m8fEK11080020158a0W01Wc + 2EG200Ge1Ey7032000pDuYq0E8Pt9omGcK1C01004040WsPK0W00GKC4y9W3@7SGn29iIw9b + 1cp7ZBCuT3z3eG126CcV11a8Hsa4qMTGtDn110WYt4AeJT4kdXZy5Ie316MBmXt0A8EPGIh9 + bN28e1c5I9GYkvJeP058004qI02NPHGA_44Cm45GA4180WC779Q07ISWXC0A8d0VkUYcVGP8 + R0BI_GX10igj08Mde0W010@RGq5Hc4dm55RCLEeDDEn3P7KGwLDCPm4lASGT68CArC7mXY00 + 040010G00GI6eWc2AOk@3konWJ9g084WGN07W0882040Ha04W000OAW6cD8XGTkvDX60100a + 912LfXme29yc02z3GGtP5S3G14000IPmY81E8K7S0001L3W22200kPuWB38G010GeEQCLG2f + OyGkKBXaWaK991Pff80IIKQIL2GIKIYa4912IMYabCa6KH0189J3g9088BHII6YWWa0B999I + I22WaWaO8f99Lr3QhcWef9uTL2QhEYGhTPH03g1m0Wbaa8Hf9h1W0O999Iaaa8899HQGIg2M + 20III04aaeer60989H22IQ4W2m4ac8899H2I2IhhGa604XlAZ00mWl6YeX1F0801KNI6XXzb + 000WfmA0201m@0CKGF17YemP068800eS236yxeG3q0C02mixFyM04Rm0n91HSW8En14IAEg4 + qG6@CMKf0YCcp9JORKRrQW002O5X9I1WXDoJOW7Q_iPaS2e0X99OX76eWaa4P991IKIJa4qa + 9YOWaja0999C9YG08D99Io0IWaWW899B52Y2TtJG8870aW4y@32g10XWJEeA4326WW4Hif60 + 3WGIIcJG1r0iGE14q903O199h1W0B998f1G02IIoS2GW4aWKD04Wi4aiWW909915QjFbASm3 + 8@KD63XJO4BDX3fVVBcbiW1bzy9F_g2mUoYzT9A5oThM_gC5M0PRMs6K1G0CzRv7m50qerzj + 9m73QnJsd40180osVjD0f20Oxrs64Q20eL9RB0A00GjijDjLFIerh0aa6240Ia000362O8M0 + 04938X190KaCH06iWn0Ce42iCaO0Mo2nGoI01QR28295W1CD8afWGZjij1T1IIRZC18985ai + 5Web4HMossg99qQN40WnvOG4aI3ZgPQHH4Y8EcW05H1WSm3Lc088AWhv9G89fG2jF14YcGm8 + cM0BKG2Oa3A91802OBIqM940I850PBa289H6qjDIYaauLts6HGJIejwE2jE6W004k01ff0I0 + 2q4Ma19010YRRKaqK803fG3g0888A5JJBW0W00beD40200mM4a8090GIOJWM0400KI1jLR09 + 910G00IssaW0100PQJIejwE2jE6Sd@u0ji40Ji_v3oW2CchgVS00Y21gqxg49O1cpNtXG880 + FzV@H85W9Uq@J0WoI2_mv3138B0_vF@3fQIIslu@Za999sZx@J2GW4Mh@@3G0IIQhUaGhN1J + IGeIQQJWWX1G89fHtK6W9abafL1YWWIJcsOQ00mQacs0G31QKIJQYC1188fjj2aW48qasA10 + cijQ284a00mcscD0B80OJIs60W00eDHRB0qMT9XMtocRjyoMXFQEopsUTjRHx4WshGBKCK4r + lKHo3U14080200Gj74C_99RYYG4050102OHo2QAWYgjweC1K020W80008d0AcAWYS2KebW4e + 000KeW5v4eIL0KqR98bN8IkKQrkWED9WGE16zVW7D5eHS24KHG120G02quXF4HO00iIhmWS2 + euRY3o98Xa4Ke602o9mYWwuA@SQQbgdGhbf605RBe180W0T2m2400W7AO8qQfw1m01000@vP + mDe6qm15DmKH5d6aw0L2I00wU0ZQJoe602Q0qYCCYQ_dNcxm0m000T11Mh0JyfI6P1imk38i + q1H7DsHO@6yYm27Bam8xw4EHHtXHmK1Cy1014000xci34040VvLGV26KKB330u4I20Ws2M8d + 0HUEeWwoF8d07YJufCQEu93HoAGY5FI8KdjwaaWZ041a00GQqpLoG4Jg4oD7Jb3A7h0ymZ1N + arqObbuWG20Wj4805400300000006000_wVXo4i8204QmGYGTM2200W0000500030WW800Wq + 0U0200GwABKoD100W2YVeXeEkg6W6AxPdsfQ8qQbmoMo2HWaiqK2aWaaGB99HOIJIgg58999 + JGI2ITg40IIIYaaWC99R8IGIIaba4G2IIahA1I2I2aaba09891IMIYWaW49989jLx0aaaaGh + z199Df0GIIe4aar0KWf9H92I2Gaqai0999WaaaeJ02qaa48999HQIJId04GQIIYaaa0JIIIX + aWa4999H0IGYacWirrL2jUcI5A8CCCkOeYKwh89feYXgWQ0K0W000H00WEHge20201004Z11 + 200H6JSH2040nmGNko9rM0Yb1Gmy99iUrGX@h1201Wy9A8b662gXYahqAd0Agjd0899A5UOW + WaWa2F8WbaaHm96Waaaena2EEfWsFMmIIIYWa4agGc9qwOGGIIM301IMIo4aaaG919HGMII_ + A7WabaK8999YIIoPT9eJ03cBWWS288V52Y6uXMM88u4ewXAioBsHaaa41000GIIIa2000099 + HI6000Ga4993WQ0G0Waa4900WQ08ukO5g1Wg22K0100G117iZVFLqL5400W228GIIIY10008 + 999o1000eaa89008m02QVXWycDerv3g18XFa8e6WeC0000899fW05W999zkq1caaae0000KI + IAR12KIIIsM01rDeLD0KKGG2f0Gmxr6KG01X0O0GIIIK000L1G010000999o000w3uWQD88H + W4UFuWQ0kgW0A4000a6W10A99J3W04999r00Hd0HK3mL54uGKEwD0m@30ml080WecUO9T5lF + YXSCkBOuIwjYpKH_FqwOwNcniWRe605kmhX9QHBLLC_md00081R3OWW04WV28uni2cVrWr0E + 0810viI5aB23RrJmJ1Ia6TKXM@G898L30a9b7L66P6QjC30yVQDn_qB7bHS18W4Ws2CBdWPI + Rcew64CE1bQOEblc7AE1HgLGlSfui0dPJhHbJLrAr1cAvcXU4o2998PdqBGGIKgqK42VrW2g + te60d2Vj2f999r0G0f98fQ0CW4a4499fhS28GQIKYaa4qE1O0GIIId0581999QW680915QjN + DCi2W08WaaKBH4U28PmGh@Fm9Pp9mo2FoGYa4Kx7PK3G3ab4a2jMhS2meJWC0IIIcJGPfEGJ + 14K5Qz@XM@Ver@7QDm30y@00O7GR39N_V1eAd3wf30qyrwTbuxFv4yGGTDcVCO9NES1rf6Qz + @TM@VerblzoOj5yJE1n5Qznn9yVer@7gJO99nPeEoSRJ6XMpKdqDGMIKALL6AeU31998XMBM + tgDGMIKAqw2a5aaajj7r04Ler9baKRn_zVeEWdM3dfSTNerla8IWv4mPu4Sgjjjb1000c@RV + VIIIaQQRrc1000y@c@@b499lDRRB0000uz@@FYaaamssss606uXaa49jjTD0Cf100W0000@3 + 00OI000R100a000Wy100O40003WmaBWOIIIX270aaa4WaaqxL78IIIYGIIID07Waaaivv3g1 + 0A0610dxl0I000G20091SGzm4i1W1GIIIQoeXcPK8bO3g1eA400Wr0eGT17awG2iiajvGIIY + I000GRRhsSR9scba89F000mjPRRfLRRBIbo6ORRR3RRRhWaaaz08e60dq000m600WB100C00 + WK78WB00Wa00WD08GIIIYRP29EjjjwijjPtaa89JYaaORhssRRssUIaaa8HIIYPRRRKRRR39 + 999aaaaWsssiqssgbaai60ca000O200WR100CB00W9000o400Gs000i68SY20IQJcwG1@SJ0 + 0GIRa4800000ZpeWjkFOyX4oNGXQ0Q2Wa0m8ZM01000810GUu702081I0WG945q_k2jYVGM4 + JK30IzROGD08qaU154SWQBGRE999DKS0a6mM1III4200YgZ0rsssrQe0ssss2qDO002g1m9r + aaaO200c1d00000OHII49000089H2QRhsmsRiT99IIi@z@@sgjjZLjRRYaaaG@@@FssssWjj + jPIIIYm@@lVijDRJRRNMG0Y@@@Q0Uocaa4iaa4LIII4@JIai99How9HIca499_499Xsijjsi + @jPpssstMosERRRRTxVRUjjjPijaPxjjLRjjDRZssnAAWjjjDijjDpsssCsssinssM30Jsaa + aqsssQRIIYSRRhsD99IcjjQxta89nsgjz08ek@3Vjy10_FqwNQtqW8wX8ek@3jkb25OewwF3 + Ev@WJ_Fuaw3uy@m_fEua@3Ev@10_FrXI11004SIij4MGZ9@7So@1gZLmm@7e_@1EzVm9mcNZ + 11dyVm9FJG2Ig60609996So@jI020110040Gv0G040G0004002080022K3GX; + INTEGER CHECKSUM =58679; +ENDDATA; + + +PROCEDURE DO_EXIT USES GV; + IRSTOP IRPAUSE; + DRSTOP DRPAUSE; + IRSCAN 8, $81; + WAIT IDLE, 20 USEC; + IF ( ! (STATUS!=0) ) THEN GOTO Label_0; + IRSTOP IRPAUSE; + DRSTOP DRPAUSE; + IRSCAN 8, $07; + WAIT IDLE, 1 CYCLES; + Label_0: + WAIT 200 USEC; + STATE RESET ; + EXIT STATUS; +ENDPROC; + +PROCEDURE DO_READ_SECURITY USES GV; + IRSTOP IRPAUSE; + DRSTOP DRPAUSE; + IRSCAN 8, $a4; + WAIT IDLE, 3 CYCLES; + DRSCAN 44, $00000000000, CAPTURE SECREG[]; + ULUWE = SECREG[ULUWE_BITLOCATION]; + ULARE = SECREG[ULARE_BITLOCATION]; + ULUPC = SECREG[ULUPC_BITLOCATION]; + ULUFE = SECREG[ULUFE_BITLOCATION]; + ULUFP = SECREG[ULUFP_BITLOCATION]; + ULUFJ = SECREG[ULUFJ_BITLOCATION]; + ULFLR = SECREG[ULFLR_BITLOCATION]; + ULULR = SECREG[ULULR_BITLOCATION]; + ULAWE = SECREG[ULAWE_BITLOCATION]; + ULARD = SECREG[ULARD_BITLOCATION]; + ULOPT[1] = SECREG[ULOPT1_BITLOCATION]; + ULOPT[0] = SECREG[ULOPT0_BITLOCATION]; +ENDPROC; + +PROCEDURE DO_OUTPUT_SECURITY USES GV; + PRINT "Security Settings :"; + IF ( ! (ULUFP==1) ) THEN GOTO Label_1; + PRINT "FlashROM Write/Erase protected by pass key."; + Label_1: + IF ( ! (ULUFJ==1) ) THEN GOTO Label_2; + PRINT "FlashROM Read protected by pass key."; + Label_2: + IF ( ! (ULAWE==1) ) THEN GOTO Label_3; + PRINT "Array Write/Erase protected by pass key."; + Label_3: + IF ( ! (ULARD==1) ) THEN GOTO Label_4; + PRINT "Array Verify protected by pass key."; + Label_4: + IF ( ! (ULUFE==1) ) THEN GOTO Label_5; + PRINT "Encrypted FlashROM Programming Enabled."; + Label_5: + IF ( ! (ULARE==1) ) THEN GOTO Label_6; + PRINT "Encrypted FPGA Array Programming Enabled."; + Label_6: + PRINT "========================================="; +ENDPROC; + +PROCEDURE DO_QUERY_SECURITY USES DO_READ_SECURITY,DO_OUTPUT_SECURITY; + CALL DO_READ_SECURITY; + CALL DO_OUTPUT_SECURITY; +ENDPROC; + +PROCEDURE READ_UROW USES BITSTREAM,GV; + IRSTOP IRPAUSE; + DRSTOP DRPAUSE; + IRSCAN 8, $c0; + WAIT IDLE, 1 CYCLES; + IRSTOP IRPAUSE; + DRSTOP DRPAUSE; + IRSCAN 8, $a8; + WAIT IDLE, 3 CYCLES; + WAIT IDLE, 132 USEC; + DRSCAN 128, $00000000000000000000000000000000, CAPTURE UROW[]; + SUROWALGOVERSION[6..0] = $00; + IF ( ! ( (UROW[5]==0)&&(UROW[0]==1)) ) THEN GOTO Label_7; + SUROWALGOVERSION[5..4] = UROW[24..23]; + Label_7: + IF ( ! ( (UROW[5]==1)&&(UROW[0]==0)) ) THEN GOTO Label_8; + SUROWALGOVERSION[5..4] = UROW[24..23]; + SUROWALGOVERSION[6] = 1; + Label_8: + SUROWCHECKSUM[15..0] = UROW[127..112]; + SUROWCYCLECOUNT = INT(UROW[111..102]); + SUROWDESIGNNAME[69..0] = UROW[101..32]; + SUROWPROGMETHOD[2..0] = UROW[31..29]; + SUROWALGOVERSION[3..0] = UROW[28..25]; + SUROW_PKG_TYPE[5..0] = UROW[22..17]; + SUROW_SW_VERSION[6..0] = UROW[16..10]; + SUROWPROGRAMSW[3..0] = UROW[9..6]; + SUROW_SRAM_DISTURB[0] = UROW[4]; + SUROW_SPEED_GRADE[2..0] = UROW[3..1]; + ACT_UROW_CYCLE_COUNT = SUROWCYCLECOUNT; +ENDPROC; + +PROCEDURE FIX_INT_ARRAYS USES GV; + IF ( ! (HEX[0]!=48) ) THEN GOTO Label_9; + FOR I = 0 TO 7; + TEMP = HEX[I]; + HEX[I] = HEX[(15-I)]; + HEX[(15-I)] = TEMP; + NEXT I; + Label_9: + LABEL_SEPARATOR = 0; +ENDPROC; + +PROCEDURE DISP_CHKSUM_DESIGN USES GV,FIX_INT_ARRAYS; + CALL FIX_INT_ARRAYS; + PRINT "CHECKSUM: ",CHR$(HEX[INT(SUROWCHECKSUM[15..12])]),CHR$(HEX[INT(SUROWCHECKSUM[11..8])]) + ,CHR$(HEX[INT(SUROWCHECKSUM[7..4])]),CHR$(HEX[INT(SUROWCHECKSUM[3..0])]); + PRINT "Design Name: ",CHR$(INT(SUROWDESIGNNAME[63..69])),CHR$(INT(SUROWDESIGNNAME[56..62])) + ,CHR$(INT(SUROWDESIGNNAME[49..55])),CHR$(INT(SUROWDESIGNNAME[42..48])),CHR$(INT(SUROWDESIGNNAME[35..41])) + ,CHR$(INT(SUROWDESIGNNAME[28..34])),CHR$(INT(SUROWDESIGNNAME[21..27])),CHR$(INT(SUROWDESIGNNAME[14..20])) + ,CHR$(INT(SUROWDESIGNNAME[7..13])),CHR$(INT(SUROWDESIGNNAME[0..6])); +ENDPROC; + +PROCEDURE DISPLAY_UROW USES CONSTBLOCK,GV,DISP_CHKSUM_DESIGN; + PRINT "User information: "; + CALL DISP_CHKSUM_DESIGN; + IF ( ! (FLAGDISPLAYCYC==1) ) THEN GOTO Label_10; + PRINT "CYCLE COUNT: ",SUROWCYCLECOUNT; + Label_10: + INTEGER TMPINT =INT(SUROWPROGMETHOD[]); + INTEGER TMPINT2 =0; + INTEGER TMPINT3 =0; + INTEGER TMPINT4 =0; + INTEGER TMPINT5 =0; + IF ( ! (TMPINT==IEEE1532) ) THEN GOTO Label_11; + PRINT "Programming Method: IEEE1532"; + Label_11: + IF ( ! (TMPINT==STAPL) ) THEN GOTO Label_12; + PRINT "Programming Method: STAPL"; + Label_12: + IF ( ! (TMPINT==DIRECTC) ) THEN GOTO Label_13; + PRINT "Programming Method: DirectC"; + Label_13: + IF ( ! (TMPINT==PDB) ) THEN GOTO Label_14; + PRINT "Programming Method: PDB"; + Label_14: + IF ( ! (TMPINT==SVF) ) THEN GOTO Label_15; + PRINT "Programming Method: SVF"; + Label_15: + PRINT "Algorithm Version: ",INT(SUROWALGOVERSION[6..0]); + TMPINT = INT(SUROW_PKG_TYPE[]); + IF ( ! (TMPINT==UNSPECIFIED) ) THEN GOTO Label_16; + PRINT "Device Package Type: package information not available from device"; + Label_16: + IF ( ! (TMPINT==QN132) ) THEN GOTO Label_17; + PRINT "Device Package Type: QN132/QNG132"; + Label_17: + IF ( ! (TMPINT==VQ100) ) THEN GOTO Label_18; + PRINT "Device Package Type: VQ100/VQG100"; + Label_18: + IF ( ! (TMPINT==TQ144) ) THEN GOTO Label_19; + PRINT "Device Package Type: TQ144/TQG144"; + Label_19: + IF ( ! (TMPINT==PQ208) ) THEN GOTO Label_20; + PRINT "Device Package Type: PQ208/PQG208"; + Label_20: + IF ( ! (TMPINT==FG144) ) THEN GOTO Label_21; + PRINT "Device Package Type: FG144/FGG144"; + Label_21: + IF ( ! (TMPINT==FG256) ) THEN GOTO Label_22; + PRINT "Device Package Type: FG256/FGG256"; + Label_22: + IF ( ! (TMPINT==FG484) ) THEN GOTO Label_23; + PRINT "Device Package Type: FG484/FGG484"; + Label_23: + IF ( ! (TMPINT==FG676) ) THEN GOTO Label_24; + PRINT "Device Package Type: FG676/FGG676"; + Label_24: + IF ( ! (TMPINT==FG896) ) THEN GOTO Label_25; + PRINT "Device Package Type: FG896/FGG896"; + Label_25: + IF ( ! (TMPINT==QN108) ) THEN GOTO Label_26; + PRINT "Device Package Type: QN108/QNG108"; + Label_26: + IF ( ! (TMPINT==QN180) ) THEN GOTO Label_27; + PRINT "Device Package Type: QN180/QNG180"; + Label_27: + IF ( ! (TMPINT==TQ100) ) THEN GOTO Label_28; + PRINT "Device Package Type: TQ100/TQG100"; + Label_28: + IF ( ! (TMPINT==CQ208) ) THEN GOTO Label_29; + PRINT "Device Package Type: CQ208/CQG208"; + Label_29: + IF ( ! (TMPINT==FG1152) ) THEN GOTO Label_30; + PRINT "Device Package Type: FG1152/FGG1152"; + Label_30: + IF ( ! (TMPINT==BG456) ) THEN GOTO Label_31; + PRINT "Device Package Type: BG456/BGG456"; + Label_31: + IF ( ! (TMPINT==UNDEFINED) ) THEN GOTO Label_32; + PRINT "Device Package Type: package information not available from device"; + Label_32: + TMPINT = INT(SUROW_SPEED_GRADE[]); + IF ( ! (TMPINT==GRADE_UNSPEC) ) THEN GOTO Label_33; + PRINT "Device Speed Grade: speed grade information not available from device"; + Label_33: + IF ( ! (TMPINT==GRADE_1) ) THEN GOTO Label_34; + PRINT "Device Speed Grade: -1"; + Label_34: + IF ( ! (TMPINT==GRADE_2) ) THEN GOTO Label_35; + PRINT "Device Speed Grade: -2"; + Label_35: + IF ( ! (TMPINT==GRADE_3) ) THEN GOTO Label_36; + PRINT "Device Speed Grade: -3"; + Label_36: + IF ( ! (TMPINT==GRADE_F) ) THEN GOTO Label_37; + PRINT "Device Speed Grade: -F"; + Label_37: + IF ( ! (TMPINT==GRADE_STD) ) THEN GOTO Label_38; + PRINT "Device Speed Grade: STD"; + Label_38: + IF ( ! (TMPINT==GRADE_4) ) THEN GOTO Label_39; + PRINT "Device Speed Grade: -4"; + Label_39: + IF ( ! (TMPINT==GRADE_UNDEF) ) THEN GOTO Label_40; + PRINT "Device Speed Grade: speed grade information not available from device"; + Label_40: + TMPINT = INT(SUROWPROGRAMSW[]); + IF ( ! (TMPINT==FP) ) THEN GOTO Label_41; + PRINT "Programmer: FlashPro"; + Label_41: + IF ( ! (TMPINT==FPLITE) ) THEN GOTO Label_42; + PRINT "Programmer: FlashPro Lite"; + Label_42: + IF ( ! (TMPINT==FP3) ) THEN GOTO Label_43; + PRINT "Programmer: FlashPro3"; + Label_43: + IF ( ! (TMPINT==SCULPTW) ) THEN GOTO Label_44; + PRINT "Programmer: SiliconSculptor II"; + Label_44: + IF ( ! (TMPINT==BPW) ) THEN GOTO Label_45; + PRINT "Programmer: BP Programmer"; + Label_45: + IF ( ! (TMPINT==DIRECTCP) ) THEN GOTO Label_46; + PRINT "Programmer: DirectC"; + Label_46: + IF ( ! (TMPINT==STP) ) THEN GOTO Label_47; + PRINT "Programmer: Actel JAM Player"; + Label_47: + IF ( ! ( ( (TMPINT==FP)||(TMPINT==FPLITE))||(TMPINT==FP3)) ) THEN GOTO Label_59; + TMPINT2 = INT(SUROW_SW_VERSION[]); + IF ( ! (TMPINT2==FP33) ) THEN GOTO Label_48; + PRINT "Software: FlashPro v3.3"; + Label_48: + IF ( ! (TMPINT2==FP34) ) THEN GOTO Label_49; + PRINT "Software: FlashPro v3.4"; + Label_49: + IF ( ! (TMPINT2==FP40) ) THEN GOTO Label_50; + PRINT "Software: FlashPro v4.0"; + Label_50: + IF ( ! (TMPINT2==FP41) ) THEN GOTO Label_51; + PRINT "Software: FlashPro v4.1"; + Label_51: + IF ( ! (TMPINT2==FP42) ) THEN GOTO Label_52; + PRINT "Software: FlashPro v4.2"; + Label_52: + IF ( ! (TMPINT2==FP50) ) THEN GOTO Label_53; + PRINT "Software: FlashPro v5.0"; + Label_53: + IF ( ! (TMPINT2==FP51) ) THEN GOTO Label_54; + PRINT "Software: FlashPro v5.1"; + Label_54: + IF ( ! (TMPINT2==FP60) ) THEN GOTO Label_55; + PRINT "Software: FlashPro v6.0"; + Label_55: + IF ( ! (TMPINT2==FP61) ) THEN GOTO Label_56; + PRINT "Software: FlashPro v6.1"; + Label_56: + IF ( ! (TMPINT2==FP62) ) THEN GOTO Label_57; + PRINT "Software: FlashPro v6.2"; + Label_57: + IF ( ! (TMPINT2==UNKNOWN) ) THEN GOTO Label_58; + PRINT "Software: FlashPro vX.X"; + Label_58: + LABEL_SEPARATOR = 0; + Label_59: + IF ( ! ( (TMPINT==SCULPTW)||(TMPINT==BPW)) ) THEN GOTO Label_63; + TMPINT3 = (INT(SUROW_SW_VERSION[6..5])+SCULPTORMAJORBASE); + TMPINT4 = (INT(SUROW_SW_VERSION[4..1])+SCULPTORMINORBASE); + TMPINT5 = 0; + IF ( ! (SUROW_SW_VERSION[0]==1) ) THEN GOTO Label_60; + TMPINT5 = 1; + Label_60: + IF ( ! (TMPINT==SCULPTW) ) THEN GOTO Label_61; + PRINT "Software: Sculptor Win v",TMPINT3,".",TMPINT4,".",TMPINT5; + Label_61: + IF ( ! (TMPINT==BPW) ) THEN GOTO Label_62; + PRINT "Software: BP Win v",TMPINT3,".",TMPINT4,".",TMPINT5; + Label_62: + LABEL_SEPARATOR = 0; + Label_63: + PRINT "========================================="; +ENDPROC; + +PROCEDURE READ_F_ROW USES GV; + IRSTOP IRPAUSE; + DRSTOP DRPAUSE; + IRSCAN 8, $c0; + WAIT IDLE, 1 CYCLES; + IRSTOP IRPAUSE; + DRSTOP DRPAUSE; + IRSCAN 8, $f9; + DRSCAN 3, FADDR[]; + WAIT IDLE, 1 CYCLES; + IRSTOP IRPAUSE; + DRSTOP DRPAUSE; + IRSCAN 8, $bf; + WAIT IDLE, 3 CYCLES; + WAIT IDLE, 132 USEC; + DRSCAN 128, $00000000000000000000000000000000, CAPTURE BUFF128[]; +ENDPROC; + +PROCEDURE DO_DEVICE_INFO USES GV,READ_UROW,DISPLAY_UROW,READ_F_ROW; + IRSTOP IRPAUSE; + DRSTOP DRPAUSE; + IRSCAN 8, $0e; + WAIT IDLE, 1 CYCLES; + DRSCAN 32, $00000000, CAPTURE BUFF32[]; + EXPORT "SILSIG", BUFF32[]; + CALL READ_UROW; + CALL DISPLAY_UROW; + FADDR[] = $0; + CALL READ_F_ROW; + EXPORT "FSN", BUFF128[55..8]; + PRINT "========================================="; +ENDPROC; + +PROCEDURE INIT_AES; + IRSTOP IRPAUSE; + DRSTOP DRPAUSE; + IRSCAN 8, $dd; + DRSCAN 128, $00000000000000000000000000000000; + WAIT IDLE, 3 CYCLES; + WAIT IDLE, 120 USEC; +ENDPROC; + +PROCEDURE DO_VERIFY_DEVICE_INFO USES GV,BITSTREAM,DO_EXIT,DO_READ_SECURITY,READ_UROW + ,DISP_CHKSUM_DESIGN; + CALL READ_UROW; + CALL DISP_CHKSUM_DESIGN; + CALL DO_READ_SECURITY; + BUFF32[31..0] = BOOL(CHECKSUM); + UROW[127..112] = BUFF32[15..0]; + UROW[101..32] = ACT_UROW_DESIGN_NAME[69..0]; + IRSTOP IRPAUSE; + DRSTOP DRPAUSE; + IRSCAN 8, $c0; + WAIT IDLE, 1 CYCLES; + IRSTOP IRPAUSE; + DRSTOP DRPAUSE; + IRSCAN 8, $a8; + WAIT IDLE, 3 CYCLES; + WAIT IDLE, 264 USEC; + DRSCAN 128, $00000000000000000000000000000000,COMPARE UROW[],$ffff003fffffffffffffffff00000000 + ,PASS; + IF ( ! (PASS==0) ) THEN GOTO UROW_CMP_OK; + STATUS = -43; + PRINT "UROW setting error."; + CALL DO_EXIT; + UROW_CMP_OK: + LABEL_SEPARATOR = 0; +ENDPROC; + +PROCEDURE READ_IDCODE_ONLY USES GV; + IRSTOP IRPAUSE; + DRSTOP DRPAUSE; + IRSCAN 8, $0f; + WAIT IDLE, 1 CYCLES; + DRSCAN 32, $00000000, CAPTURE ID[]; + EXPORT "IDCODE", ID[]; +ENDPROC; + +PROCEDURE VERIFY_ID_DMK USES GV,DO_EXIT,INIT_AES; + CALL INIT_AES; + IRSTOP IRPAUSE; + DRSTOP DRPAUSE; + IRSCAN 8, $0a; + DRSCAN 128, M7BUFF[]; + WAIT IDLE, 3 CYCLES; + WAIT IDLE, 128 USEC; + DRSCAN 128, $00000000000000000000000000000000, CAPTURE BUFF128[],COMPARE $c0000000000000000000000000000000 + ,$c0000000000000000000000000000000,PASS; + IF ( ! (BUFF128[127]==0) ) THEN GOTO M7VERDONE; + STATUS = -31; + PRINT "Failed to verify AES Sec."; + CALL DO_EXIT; + M7VERDONE: + IF ( ! ( (BUFF128[126]==0)||(BM7DEVICE==0)) ) THEN GOTO MXIDOK; + IF ( ! ( (BUFF128[126]==1)&&(BM7DEVICE==0)) ) THEN GOTO LDETECTM1; + STATUS = -32; + PRINT "Failed to verify IDCODE."; + PRINT "M7 Device detected."; + CALL DO_EXIT; + LDETECTM1: + IF ( ! (BUFF128[126]==0) ) THEN GOTO Label_66; + IRSTOP IRPAUSE; + DRSTOP DRPAUSE; + IRSCAN 8, $0a; + DRSCAN 128, M1BUFF[]; + WAIT IDLE, 3 CYCLES; + WAIT IDLE, 128 USEC; + DRSCAN 128, $00000000000000000000000000000000, CAPTURE BUFF128[],COMPARE $c0000000000000000000000000000000 + ,$c0000000000000000000000000000000,PASS; + IF ( ! (BUFF128[127]==0) ) THEN GOTO M1VERDONE; + STATUS = -31; + PRINT "Failed to verify AES Sec."; + CALL DO_EXIT; + M1VERDONE: + BOOLEAN BTMPBUFFBIT126 = BUFF128[126]; + IF ( ! ( (BTMPBUFFBIT126==1)&&(BM1DEVICE==0)) ) THEN GOTO REGDEV; + STATUS = -32; + PRINT "Failed to verify IDCODE."; + PRINT "M1 Device detected."; + CALL DO_EXIT; + REGDEV: + IF ( ! ( (BTMPBUFFBIT126==0)&&(BM7DEVICE==1)) ) THEN GOTO Label_64; + STATUS = -32; + PRINT "Failed to verify IDCODE."; + PRINT "The Target is not an M7 Device."; + CALL DO_EXIT; + Label_64: + IF ( ! ( (BTMPBUFFBIT126==0)&&(BM1DEVICE==1)) ) THEN GOTO Label_65; + STATUS = -32; + PRINT "Failed to verify IDCODE."; + PRINT "The Target is not an M1 Device."; + CALL DO_EXIT; + Label_65: + LABEL_SEPARATOR = 0; + Label_66: + LABEL_SEPARATOR = 0; + MXIDOK: + LABEL_SEPARATOR = 0; +ENDPROC; + +PROCEDURE VERIFY_IDCODE USES GV,PARAMETERS,DO_EXIT; + FREQUENCY (FREQ*1000000); + WAIT RESET, 5 CYCLES; + IRSTOP IRPAUSE; + DRSTOP DRPAUSE; + IRSCAN 8, $0f; + DRSCAN 32, $00000000; + WAIT IDLE, 1 CYCLES; + DRSCAN 32, $00000000, CAPTURE ID[],COMPARE IDCODEVALUE[],IDMASK[],PASS; + IF ( ! (PASS==0) ) THEN GOTO IDOK; + STATUS = 6; + PRINT "Failed to verify IDCODE"; + CALL DO_EXIT; + IDOK: + IDREV = INT(ID[31..28]); + IDFAB = INT(ID[24..24]); +ENDPROC; + +PROCEDURE IS_SECOK USES GV,DO_EXIT; + IF ( ! (SECKEY_OK==0) ) THEN GOTO SECOK; + STATUS = -35; + PRINT "Error, pass key match failure"; + CALL DO_EXIT; + SECOK: + LABEL_SEPARATOR = 0; +ENDPROC; + +PROCEDURE DO_CHECK_R USES GV,DO_EXIT,DO_READ_SECURITY; + CALL DO_READ_SECURITY; + IF ( ! (ULARE==1) ) THEN GOTO ARRAYEPR; + STATUS = -33; + PRINT "FPGA Array Encryption is enforced. Plain text verification is prohibited."; + CALL DO_EXIT; + ARRAYEPR: + IF ( ! (ULARD==1) ) THEN GOTO SKIPRCHK1; + STATUS = -30; + PRINT "FPGA Array Verification is protected by pass key."; + PRINT "A valid pass key needs to be provided."; + CALL DO_EXIT; + SKIPRCHK1: + IF ( ! (ULARD==0) ) THEN GOTO Label_67; + CHKSEC = 0; + Label_67: + LABEL_SEPARATOR = 0; +ENDPROC; + +PROCEDURE DO_CHECK_W USES GV,DO_EXIT,DO_READ_SECURITY; + CALL DO_READ_SECURITY; + IF ( ! (ULAWE==1) ) THEN GOTO ARRAYWP; + STATUS = -28; + PRINT "FPGA Array Write/Erase is protected by pass key."; + PRINT "A valid pass key needs to be provided."; + CALL DO_EXIT; + ARRAYWP: + IF ( ! (ULARD==1) ) THEN GOTO ARRAYRPW; + STATUS = -30; + PRINT "FPGA Array Verification is protected by pass key."; + PRINT "A valid pass key needs to be provided."; + CALL DO_EXIT; + ARRAYRPW: + IF ( ! (ULARE==1) ) THEN GOTO ARRAYEPW; + STATUS = -33; + PRINT "FPGA Array Encryption is enforced. Plain text programming is prohibited."; + CALL DO_EXIT; + ARRAYEPW: + LABEL_SEPARATOR = 0; +ENDPROC; + +PROCEDURE BP_VER USES GV; + BOOLEAN PLAYER_VERSION_BOOLEAN[32]; + PLAYER_VERSION_BOOLEAN[31..0] = BOOL(PLAYERVERSIONVARIABLE); + INTEGER PLAYER_MAJOR_VERSION =(INT(PLAYER_VERSION_BOOLEAN[23..16])-SCULPTORMAJORBASE); + INTEGER PLAYER_MINOR_VERSION =(INT(PLAYER_VERSION_BOOLEAN[15..8])-SCULPTORMINORBASE); + ACT_UROW_SW_VERSION[6..5] = BOOL(PLAYER_MAJOR_VERSION); + ACT_UROW_SW_VERSION[4..1] = BOOL(PLAYER_MINOR_VERSION); + ACT_UROW_SW_VERSION[0] = PLAYER_VERSION_BOOLEAN[0]; +ENDPROC; + +PROCEDURE DO_INITIALIZE USES GV,DO_EXIT,VERIFY_ID_DMK,VERIFY_IDCODE,DO_CHECK_R,DO_CHECK_W + ,BP_VER; + CALL VERIFY_IDCODE; + BOOLEAN BSR[1056]; + BOOLEAN SAMPLE_DEVICE[1056]; + BSR[1055..0] = BSRPATTERN[1055..0]; + BOOLEAN SHIFT_DATA[1056]; + IRSCAN 8, $01; + DRSCAN 1056, BSR[]; + WAIT IDLE, 1 CYCLES; + DRSCAN 1056, SHIFT_DATA[], CAPTURE SAMPLE_DEVICE[]; + FOR I = 0 TO 1055; + IF ( ! (SAMPLEMASK[I]==1) ) THEN GOTO Label_68; + BSR[I] = SAMPLE_DEVICE[I]; + Label_68: + LABEL_SEPARATOR = 0; + NEXT I; + IRSTOP IRPAUSE; + DRSTOP DRPAUSE; + IRSCAN 8, $01; + DRSCAN 1056, BSR[]; + WAIT IDLE, 1 CYCLES; + IRSTOP IRPAUSE; + DRSTOP DRPAUSE; + IRSCAN 8, $c0; + WAIT IDLE, 1 CYCLES; + IRSTOP IRPAUSE; + DRSTOP DRPAUSE; + IRSCAN 8, $80; + DRSCAN 18, $00000; + WAIT IDLE, 3 CYCLES; + WAIT IDLE, 1000 USEC; + DRSCAN 18, $00000,COMPARE $30000,$30000,PASS; + IF ( ! (PASS==0) ) THEN GOTO CRCOK; + STATUS = -26; + PRINT "Failed to enter programming mode."; + EXPORT "ISC_Config_Result", ISC_CONFIG_RESULT[]; + CALL DO_EXIT; + CRCOK: + IRSTOP IRPAUSE; + DRSTOP DRPAUSE; + IRSCAN 8, $84; + DRSCAN 5, INITIALIZE_DATA[], CAPTURE INITIALIZE_DATA[]; + WAIT IDLE, 1 CYCLES; + IF ( ! (INITIALIZE_DATA[2]==1) ) THEN GOTO JTAGOK; + STATUS = -25; + PRINT "Failed to enter programming mode"; + CALL DO_EXIT; + JTAGOK: + CALL VERIFY_ID_DMK; + IF ( ! (CHKARRAY==1) ) THEN GOTO SKIPCHKARRAY; + IF ( ! (ARRAYRONLY==0) ) THEN GOTO Label_69; + CALL DO_CHECK_W; + Label_69: + IF ( ! (ARRAYRONLY==1) ) THEN GOTO Label_70; + CALL DO_CHECK_R; + Label_70: + LABEL_SEPARATOR = 0; + SKIPCHKARRAY: + IF ( ! (PLAYERVERSIONVARIABLE!=0) ) THEN GOTO Label_71; + CALL BP_VER; + Label_71: + LABEL_SEPARATOR = 0; +ENDPROC; + +PROCEDURE READ_INITIALIZE USES GV,DO_INITIALIZE; + CHKFROM = 0; + CHKARRAY = 0; + CHKNVM = 0; + CHKSEC = 0; + CALL DO_INITIALIZE; +ENDPROC; + +PROCEDURE NW_INITIALIZE USES GV,DO_INITIALIZE; + CHKFROM = 0; + CHKARRAY = 0; + CALL DO_INITIALIZE; +ENDPROC; + +PROCEDURE NR_INITIALIZE USES GV,DO_INITIALIZE; + CHKFROM = 0; + CHKARRAY = 0; + CALL DO_INITIALIZE; +ENDPROC; + +PROCEDURE AW_INITIALIZE USES GV,DO_INITIALIZE; + ARRAYRONLY = 0; + CHKFROM = 0; + CHKARRAY = 1; + CHKNVM = 0; + CALL DO_INITIALIZE; +ENDPROC; + +PROCEDURE AR_INITIALIZE USES GV,DO_INITIALIZE; + ARRAYRONLY = 1; + CHKFROM = 0; + CHKARRAY = 1; + CHKNVM = 0; + CALL DO_INITIALIZE; +ENDPROC; + +PROCEDURE W_INITIALIZE USES GV,DO_INITIALIZE; + ARRAYRONLY = 0; + CHKARRAY = 1; + CALL DO_INITIALIZE; +ENDPROC; + +PROCEDURE R_INITIALIZE USES GV,DO_INITIALIZE; + ARRAYRONLY = 1; + CHKARRAY = 1; + CALL DO_INITIALIZE; +ENDPROC; + +PROCEDURE INITIALIZE USES GV,DO_INITIALIZE; + ARRAYRONLY = 0; + FROMRONLY = 0; + CHKFROM = 1; + CHKARRAY = 1; + CALL DO_INITIALIZE; +ENDPROC; + +PROCEDURE POLL_ERASE USES GV; + PASS = 0; + INTEGER ILOOP_0; + FOR ILOOP_0 = 262141 - 1 TO 0 STEP -1; + IRSTOP IRPAUSE; + DRSTOP DRPAUSE; + IRSCAN 8, $84; + WAIT IDLE, 1 CYCLES; + WAIT IDLE, 1000 USEC; + DRSCAN 5, $00,COMPARE $00,$03,PASS; + IF PASS THEN ILOOP_0 = 0; + NEXT ILOOP_0; +ENDPROC; + +PROCEDURE POLL_PROGRAM USES GV; + INTEGER ILOOP_1; + FOR ILOOP_1 = 16381 - 1 TO 0 STEP -1; + IRSTOP IRPAUSE; + DRSTOP DRPAUSE; + IRSCAN 8, $84; + WAIT IDLE, 1 CYCLES; + WAIT IDLE, 100 USEC; + DRSCAN 5, $00,COMPARE $00,$0b,PASS; + IF PASS THEN ILOOP_1 = 0; + NEXT ILOOP_1; +ENDPROC; + +PROCEDURE PROGRAM_UROW USES GV,BITSTREAM,DO_EXIT,POLL_PROGRAM; + FOR FROMROWNUMBER = NUMBEROFFROMROWS TO 1 STEP -1; + IRSTOP IRPAUSE; + DRSTOP DRPAUSE; + IRSCAN 8, $9f; + DRSCAN 3, BOOL((FROMROWNUMBER-1)); + WAIT IDLE, 1 CYCLES; + IRSTOP IRPAUSE; + DRSTOP DRPAUSE; + IRSCAN 8, $9b; + DRSCAN 128, $ffffffffffffffffffffffffffffffff; + WAIT IDLE, 5 CYCLES; + WAIT IDLE, 10000 USEC; + NEXT FROMROWNUMBER; + IF ( ! (ISERASEONLY==0) ) THEN GOTO SKIP_CYC_INCREMENT; + IF ( ! (ACT_UROW_CYCLE_COUNT==1023) ) THEN GOTO Label_72; + ACT_UROW_CYCLE_COUNT = (ACT_UROW_CYCLE_COUNT+1); + Label_72: + LABEL_SEPARATOR = 0; + SKIP_CYC_INCREMENT: + IF ( ! (ISERASEONLY==1) ) THEN GOTO Label_73; + UROW[] = $ffffffffffffffffffffffffffffffff; + Label_73: + IF ( ! ( (PERMLOCK==1)&&(ULAWE==1)) ) THEN GOTO Label_74; + ISRESTOREDESIGN = 1; + Label_74: + IF ( ! ( (ISERASEONLY==0)||(ISRESTOREDESIGN==1)) ) THEN GOTO SKIP_DESIGN_INFO; + BUFF32[31..0] = BOOL(CHECKSUM); + IF ( ! ( !ISRESTOREDESIGN) ) THEN GOTO Label_75; + UROW[127..112] = BUFF32[15..0]; + Label_75: + IF ( ! ISRESTOREDESIGN ) THEN GOTO Label_76; + UROW[127..112] = SUROWCHECKSUM[15..0]; + Label_76: + IF ( ! ( !ISRESTOREDESIGN) ) THEN GOTO Label_77; + UROW[101..32] = ACT_UROW_DESIGN_NAME[69..0]; + Label_77: + IF ( ! ISRESTOREDESIGN ) THEN GOTO Label_78; + UROW[101..32] = SUROWDESIGNNAME[69..0]; + Label_78: + LABEL_SEPARATOR = 0; + SKIP_DESIGN_INFO: + BUFF32[31..0] = BOOL(ACT_UROW_CYCLE_COUNT); + UROW[111..102] = BUFF32[9..0]; + UROW[31..29] = ACT_UROW_PROG_METHOD[2..0]; + UROW[28..25] = ACT_UROW_ALGO_VERSION[3..0]; + UROW[16..10] = ACT_UROW_SW_VERSION[6..0]; + UROW[9..6] = ACT_UROW_PROGRAM_SW[3..0]; + UROW[4] = SUROW_SRAM_DISTURB[0]; + IF ( ! (ACT_UROW_ALGO_VERSION[6]==1) ) THEN GOTO Label_79; + UROW[5] = 1; + UROW[0] = 0; + UROW[24..23] = ACT_UROW_ALGO_VERSION[5..4]; + Label_79: + IF ( ! (ACT_UROW_ALGO_VERSION[6]==0) ) THEN GOTO Label_80; + UROW[5] = 0; + UROW[0] = 1; + UROW[24..23] = ACT_UROW_ALGO_VERSION[5..4]; + Label_80: + IRSTOP IRPAUSE; + DRSTOP DRPAUSE; + IRSCAN 8, $a7; + DRSCAN 128, UROW[]; + WAIT IDLE, 15 CYCLES; + CALL POLL_PROGRAM; + IF ( ! (PASS==0) ) THEN GOTO PROGRAM_OK3; + STATUS = -24; + PRINT "Failed to program UROW"; + CALL DO_EXIT; + PROGRAM_OK3: + IRSTOP IRPAUSE; + DRSTOP DRPAUSE; + IRSCAN 8, $c0; + WAIT IDLE, 1 CYCLES; + IRSTOP IRPAUSE; + DRSTOP DRPAUSE; + IRSCAN 8, $a8; + WAIT IDLE, 3 CYCLES; + WAIT IDLE, 132 USEC; + DRSCAN 128, $00000000000000000000000000000000,COMPARE UROW[],UROW_MASK[],PASS; + IF ( ! (PASS==0) ) THEN GOTO UROW_OK; + STATUS = -24; + PRINT "Failed to program UROW"; + CALL DO_EXIT; + UROW_OK: + LABEL_SEPARATOR = 0; +ENDPROC; + +PROCEDURE FAIL_ERASE USES GV,DO_EXIT; + STATUS = 8; + PRINT "Failed Erase Operation"; + CALL DO_EXIT; +ENDPROC; + +PROCEDURE EXE_ERASE USES BITSTREAM,GV,READ_UROW,POLL_ERASE,PROGRAM_UROW,FAIL_ERASE; + IF ( ! (COMBERASESELECT[14]==1) ) THEN GOTO SKIPRUROW; + CALL READ_UROW; + EXPORT "ACTEL_SLOG_UROW", UROW[]; + SKIPRUROW: + IRSTOP IRPAUSE; + DRSTOP DRPAUSE; + IRSCAN 8, $85; + DRSCAN 23, COMBERASESELECT[]; + WAIT IDLE, 3 CYCLES; + CALL POLL_ERASE; + IF ( ! (PASS==0) ) THEN GOTO ERASEOK; + CALL FAIL_ERASE; + ERASEOK: + IF ( ! (COMBERASESELECT[14]==1) ) THEN GOTO Label_81; + CALL PROGRAM_UROW; + Label_81: + LABEL_SEPARATOR = 0; +ENDPROC; + +PROCEDURE DO_ERASE USES GV,EXE_ERASE; + PRINT "Erase ..."; + COMBERASESELECT[22..0] = $004000; + COMBERASESELECT[0] = 1; + CALL EXE_ERASE; + PRINT "Completed erase"; +ENDPROC; + +PROCEDURE DO_ERASE_ARRAY USES GV,EXE_ERASE; + PRINT "Erase FPGA Array ..."; + COMBERASESELECT[22..0] = $004001; + CALL EXE_ERASE; +ENDPROC; + +PROCEDURE DO_ERASE_ONLY USES GV,DO_ERASE; + ISERASEONLY = 1; + CALL DO_ERASE; +ENDPROC; + +PROCEDURE DO_ERASE_ARRAY_ONLY USES GV,DO_ERASE_ARRAY; + ISERASEONLY = 1; + CALL DO_ERASE_ARRAY; +ENDPROC; + +PROCEDURE DO_ERASE_ALL USES GV,EXE_ERASE; + IF ( ! ( (BM7DEVICE==1)||(BM1DEVICE==1)) ) THEN GOTO Label_82; + PRINT "Erase FPGA Array and FlashROM ..."; + Label_82: + IF ( ! ( (BM7DEVICE!=1)&&(BM1DEVICE!=1)) ) THEN GOTO Label_83; + PRINT "Erase FPGA Array, FlashROM and Security Settings ..."; + Label_83: + COMBERASESELECT[22..0] = $7fc00f; + ISERASEONLY = 1; + CALL EXE_ERASE; +ENDPROC; + +PROCEDURE LOAD_ROW_DATA USES BITSTREAM,GV; + FOR SDTILE = 1 TO NUMBEROFSDTILES; + FOR I = 1 TO 8; + IRSTOP IRPAUSE; + DRSTOP DRPAUSE; + IRSCAN 8, $89; + DRSCAN 26, DATASTREAM[(DATAINDEX+25)..DATAINDEX]; + WAIT IDLE, 3 CYCLES; + DATAINDEX = (DATAINDEX+26); + NEXT I; + NEXT SDTILE; +ENDPROC; + +PROCEDURE EXE_PROGRAM USES GV,DO_EXIT,POLL_PROGRAM; + IRSTOP IRPAUSE; + DRSTOP DRPAUSE; + IRSCAN 8, $83; + WAIT IDLE, 3 CYCLES; + CALL POLL_PROGRAM; + IF ( ! (PASS==0) ) THEN GOTO Label_84; + STATUS = 10; + PRINT "Failed to program FPGA array at row ",ROWNUMBER,"."; + CALL DO_EXIT; + Label_84: + LABEL_SEPARATOR = 0; +ENDPROC; + +PROCEDURE EXE_VERIFY USES GV,DO_EXIT,POLL_PROGRAM; + IRSTOP IRPAUSE; + DRSTOP DRPAUSE; + IRSCAN 8, $8d; + DRSCAN 2, VERIFYEOL[]; + WAIT IDLE, 3 CYCLES; + WAIT IDLE, 132 USEC; + CALL POLL_PROGRAM; + IF ( ! (PASS==0) ) THEN GOTO Label_85; + STATUS = 11; + PRINT "Verify 0 failed at row ",ROWNUMBER,"."; + CALL DO_EXIT; + Label_85: + IRSCAN 8, $8d; + DRSCAN 2, VERIFYEOL[],COMPARE $0,$3,PASS; + IF ( ! (PASS==0) ) THEN GOTO Label_86; + STATUS = 11; + PRINT "Verify 0 failed at row ",ROWNUMBER,"."; + CALL DO_EXIT; + Label_86: + IRSTOP IRPAUSE; + DRSTOP DRPAUSE; + IRSCAN 8, $8e; + DRSCAN 2, VERIFYEOL[]; + WAIT IDLE, 3 CYCLES; + WAIT IDLE, 132 USEC; + CALL POLL_PROGRAM; + IF ( ! (PASS==0) ) THEN GOTO Label_87; + STATUS = 11; + PRINT "Verify 1 failed at row ",ROWNUMBER,"."; + CALL DO_EXIT; + Label_87: + IRSCAN 8, $8e; + DRSCAN 2, VERIFYEOL[],COMPARE $0,$3,PASS; + IF ( ! (PASS==0) ) THEN GOTO Label_88; + STATUS = 11; + PRINT "Verify 1 failed at row ",ROWNUMBER,"."; + CALL DO_EXIT; + Label_88: + LABEL_SEPARATOR = 0; +ENDPROC; + +PROCEDURE DO_PROGRAM USES GV,LOAD_ROW_DATA,EXE_PROGRAM; + IRSTOP IRPAUSE; + DRSTOP DRPAUSE; + IRSCAN 8, $87; + DRSCAN 2, $2; + WAIT IDLE, 3 CYCLES; + PRINT "Programming FPGA Array"; + DATAINDEX = 0; + ROWNUMBER = (NUMBEROFMAPROWS-1); + INTEGER IREPEAT_0; + FOR IREPEAT_0 = NUMBEROFMAPROWS - 1 TO 0 STEP -1; + CALL LOAD_ROW_DATA; + CALL EXE_PROGRAM; + IRSTOP IRPAUSE; + DRSTOP DRPAUSE; + IRSCAN 8, $87; + DRSCAN 2, $3; + WAIT IDLE, 3 CYCLES; + EXPORT "PERCENT_DONE", ((100*((NUMBEROFMAPROWS-ROWNUMBER)+1))/NUMBEROFMAPROWS); + ROWNUMBER = (ROWNUMBER-1); + NEXT IREPEAT_0; +ENDPROC; + +PROCEDURE DO_VERIFY USES GV,LOAD_ROW_DATA,EXE_VERIFY; + IRSTOP IRPAUSE; + DRSTOP DRPAUSE; + IRSCAN 8, $87; + DRSCAN 2, $2; + WAIT IDLE, 3 CYCLES; + PRINT "Verifying FPGA Array"; + DATAINDEX = 0; + ROWNUMBER = (NUMBEROFMAPROWS-1); + INTEGER IREPEAT_1; + FOR IREPEAT_1 = NUMBEROFMAPROWS - 1 TO 0 STEP -1; + CALL LOAD_ROW_DATA; + CALL EXE_VERIFY; + IRSTOP IRPAUSE; + DRSTOP DRPAUSE; + IRSCAN 8, $87; + DRSCAN 2, $3; + WAIT IDLE, 3 CYCLES; + EXPORT "PERCENT_DONE", ((100*((NUMBEROFMAPROWS-ROWNUMBER)+1))/NUMBEROFMAPROWS); + ROWNUMBER = (ROWNUMBER-1); + NEXT IREPEAT_1; + PRINT " Verifying FPGA Array -- pass"; +ENDPROC; + +PROCEDURE DO_VERIFY_BOL USES GV,DO_VERIFY; + VERIFYEOL[0] = 0; + CALL DO_VERIFY; +ENDPROC; + +PROCEDURE DO_VERIFY_EOL USES GV,DO_VERIFY; + VERIFYEOL[0] = 1; + CALL DO_VERIFY; +ENDPROC; + +PROCEDURE DO_PROGRAM_RLOCK USES GV,DO_EXIT,POLL_PROGRAM; + DATAINDEX = 0; + INTEGER IREPEAT_2; + FOR IREPEAT_2 = NUMBEROFSDTILES - 1 TO 0 STEP -1; + FOR I = 1 TO 8; + IRSTOP IRPAUSE; + DRSTOP DRPAUSE; + IRSCAN 8, $89; + DRSCAN 26, RLOCK[(DATAINDEX+25)..DATAINDEX]; + WAIT IDLE, 3 CYCLES; + DATAINDEX = (DATAINDEX+26); + NEXT I; + NEXT IREPEAT_2; + IRSTOP IRPAUSE; + DRSTOP DRPAUSE; + IRSCAN 8, $8c; + WAIT IDLE, 3 CYCLES; + CALL POLL_PROGRAM; + IF ( ! (PASS==0) ) THEN GOTO Label_89; + STATUS = 10; + PRINT "Failed to program Rlock."; + CALL DO_EXIT; + Label_89: + LABEL_SEPARATOR = 0; +ENDPROC; + +PROCEDURE DO_READ_IDCODE USES READ_IDCODE_ONLY; + WAIT RESET, 5 CYCLES; + CALL READ_IDCODE_ONLY; + EXIT 0; +ENDPROC; + + +CRC C470; Index: Actel/usbDeviceActelTop/smartgen/smartgen.aws =================================================================== --- Actel/usbDeviceActelTop/smartgen/smartgen.aws (nonexistent) +++ Actel/usbDeviceActelTop/smartgen/smartgen.aws (revision 40) @@ -0,0 +1 @@ +smartgenVerilogVerilog \ No newline at end of file Index: Actel/usbDeviceActelTop/constraint/usbDeviceActelTop.pdc =================================================================== --- Actel/usbDeviceActelTop/constraint/usbDeviceActelTop.pdc (nonexistent) +++ Actel/usbDeviceActelTop/constraint/usbDeviceActelTop.pdc (revision 40) @@ -0,0 +1,41 @@ +# Actel Physical design constraints file +# Version: 8.0 SP2 8.0.3.9 +# Design Name: usbDeviceActelTop +# Input Netlist Format: edif +# Family: IGLOO , Die: AGL600V2 , Package: 256 FBGA , Speed grade: STD +# Date generated: Thu Oct 25 13:06:12 2007 + +# +# IO banks setting +# + +set_iobank Bank3 -vcci 3.30 -fixed no +set_iobank Bank2 -vcci 3.30 -fixed no +set_iobank Bank1 -vcci 3.30 -fixed no +set_iobank Bank0 -vcci 3.30 -fixed no + +# +# I/O constraints +# + +set_io ledOut\[0\] -iostd LVTTL -REGISTER No -OUT_DRIVE 12 -SLEW High -RES_PULL None -SKEW Off -OUT_LOAD 5 -pinname B7 -fixed yes +set_io ledOut\[1\] -iostd LVTTL -REGISTER No -OUT_DRIVE 12 -SLEW High -RES_PULL None -SKEW Off -OUT_LOAD 5 -pinname C7 -fixed yes +set_io ledOut\[2\] -iostd LVTTL -REGISTER No -OUT_DRIVE 12 -SLEW High -RES_PULL None -SKEW Off -OUT_LOAD 5 -pinname P5 -fixed yes +set_io ledOut\[3\] -iostd LVTTL -REGISTER No -OUT_DRIVE 12 -SLEW High -RES_PULL None -SKEW Off -OUT_LOAD 5 -pinname T2 -fixed yes +set_io ledOut\[4\] -iostd LVTTL -REGISTER No -OUT_DRIVE 12 -SLEW High -RES_PULL None -SKEW Off -OUT_LOAD 5 -pinname P4 -fixed yes +set_io ledOut\[5\] -iostd LVTTL -REGISTER No -OUT_DRIVE 12 -SLEW High -RES_PULL None -SKEW Off -OUT_LOAD 5 -pinname R3 -fixed yes +set_io ledOut\[6\] -iostd LVTTL -REGISTER No -OUT_DRIVE 12 -SLEW High -RES_PULL None -SKEW Off -OUT_LOAD 5 -pinname P2 -fixed yes +set_io ledOut\[7\] -iostd LVTTL -REGISTER No -OUT_DRIVE 12 -SLEW High -RES_PULL None -SKEW Off -OUT_LOAD 5 -pinname P1 -fixed yes +set_io ledOut\[8\] -iostd LVTTL -REGISTER No -OUT_DRIVE 12 -SLEW High -RES_PULL None -SKEW Off -OUT_LOAD 5 -pinname R1 -fixed yes +set_io ledOut\[9\] -iostd LVTTL -REGISTER No -OUT_DRIVE 12 -SLEW High -RES_PULL None -SKEW Off -OUT_LOAD 5 -pinname R2 -fixed yes + +set_io clk -iostd LVTTL -REGISTER No -RES_PULL None -pinname G13 -fixed yes +set_io rst_n -iostd LVTTL -REGISTER No -RES_PULL None -pinname N6 -fixed yes + +set_io usbSlaveVP -iostd LVTTL -REGISTER No -OUT_DRIVE 12 -SLEW High -RES_PULL None -SKEW Off -OUT_LOAD 5 -pinname A8 -fixed yes +set_io usbSlaveVM -iostd LVTTL -REGISTER No -OUT_DRIVE 12 -SLEW High -RES_PULL None -SKEW Off -OUT_LOAD 5 -pinname D7 -fixed yes +set_io usbSlaveOE_n -iostd LVTTL -REGISTER No -OUT_DRIVE 12 -SLEW High -RES_PULL None -SKEW Off -OUT_LOAD 5 -pinname E8 -fixed yes +set_io usbDPlusPullup -iostd LVTTL -REGISTER No -OUT_DRIVE 12 -SLEW High -RES_PULL None -SKEW Off -OUT_LOAD 5 -pinname C8 -fixed yes + + + Index: Actel/usbDeviceActelTop/hdl/processRxByte.v =================================================================== --- Actel/usbDeviceActelTop/hdl/processRxByte.v (nonexistent) +++ Actel/usbDeviceActelTop/hdl/processRxByte.v (revision 40) @@ -0,0 +1,493 @@ + +// File : ../RTL/serialInterfaceEngine/processRxByte.v +// Generated : 11/10/06 05:37:22 +// From : ../RTL/serialInterfaceEngine/processRxByte.asf +// By : FSM2VHDL ver. 5.0.0.9 + +////////////////////////////////////////////////////////////////////// +//// //// +//// processRxByte +//// //// +//// This file is part of the usbhostslave opencores effort. +//// http://www.opencores.org/cores/usbhostslave/ //// +//// //// +//// Module Description: //// +//// +//// //// +//// To Do: //// +//// +//// //// +//// Author(s): //// +//// - Steve Fielding, sfielding@base2designs.com //// +//// //// +////////////////////////////////////////////////////////////////////// +//// //// +//// Copyright (C) 2004 Steve Fielding and OPENCORES.ORG //// +//// //// +//// This source file may be used and distributed without //// +//// restriction provided that this copyright statement is not //// +//// removed from the file and that any derivative work contains //// +//// the original copyright notice and the associated disclaimer. //// +//// //// +//// This source file is free software; you can redistribute it //// +//// and/or modify it under the terms of the GNU Lesser General //// +//// Public License as published by the Free Software Foundation; //// +//// either version 2.1 of the License, or (at your option) any //// +//// later version. //// +//// //// +//// This source is distributed in the hope that it will be //// +//// useful, but WITHOUT ANY WARRANTY; without even the implied //// +//// warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR //// +//// PURPOSE. See the GNU Lesser General Public License for more //// +//// details. //// +//// //// +//// You should have received a copy of the GNU Lesser General //// +//// Public License along with this source; if not, download it //// +//// from http://www.opencores.org/lgpl.shtml //// +//// //// +////////////////////////////////////////////////////////////////////// +// +`include "timescale.v" +`include "usbSerialInterfaceEngine_h.v" +`include "usbConstants_h.v" + +module processRxByte (CRC16En, CRC16Result, CRC16UpdateRdy, CRC5En, CRC5Result, CRC5UpdateRdy, CRC5_8Bit, CRCData, RxByteIn, RxCtrlIn, RxCtrlOut, RxDataOutWEn, RxDataOut, clk, processRxByteRdy, processRxDataInWEn, rst, rstCRC); +input [15:0] CRC16Result; +input CRC16UpdateRdy; +input [4:0] CRC5Result; +input CRC5UpdateRdy; +input [7:0] RxByteIn; +input [7:0] RxCtrlIn; +input clk; +input processRxDataInWEn; +input rst; +output CRC16En; +output CRC5En; +output CRC5_8Bit; +output [7:0] CRCData; +output [7:0] RxCtrlOut; +output RxDataOutWEn; +output [7:0] RxDataOut; +output processRxByteRdy; +output rstCRC; + +reg CRC16En, next_CRC16En; +wire [15:0] CRC16Result; +wire CRC16UpdateRdy; +reg CRC5En, next_CRC5En; +wire [4:0] CRC5Result; +wire CRC5UpdateRdy; +reg CRC5_8Bit, next_CRC5_8Bit; +reg [7:0] CRCData, next_CRCData; +wire [7:0] RxByteIn; +wire [7:0] RxCtrlIn; +reg [7:0] RxCtrlOut, next_RxCtrlOut; +reg RxDataOutWEn, next_RxDataOutWEn; +reg [7:0] RxDataOut, next_RxDataOut; +wire clk; +reg processRxByteRdy, next_processRxByteRdy; +wire processRxDataInWEn; +wire rst; +reg rstCRC, next_rstCRC; + +// diagram signals declarations +reg ACKRxed, next_ACKRxed; +reg CRCError, next_CRCError; +reg NAKRxed, next_NAKRxed; +reg [2:0]RXByteStMachCurrState, next_RXByteStMachCurrState; +reg [9:0]RXDataByteCnt, next_RXDataByteCnt; +reg [7:0]RxByte, next_RxByte; +reg [7:0]RxCtrl, next_RxCtrl; +reg RxOverflow, next_RxOverflow; +reg [7:0]RxStatus; +reg RxTimeOut, next_RxTimeOut; +reg Signal1, next_Signal1; +reg bitStuffError, next_bitStuffError; +reg dataSequence, next_dataSequence; +reg stallRxed, next_stallRxed; + +// BINARY ENCODED state machine: prRxByte +// State codes definitions: +`define CHK_ST 4'b0000 +`define START_PRBY 4'b0001 +`define WAIT_BYTE 4'b0010 +`define IDLE_CHK_START 4'b0011 +`define CHK_SYNC_DO 4'b0100 +`define CHK_PID_DO_CHK 4'b0101 +`define CHK_PID_FIRST_BYTE_PROC 4'b0110 +`define HSHAKE_FIN 4'b0111 +`define HSHAKE_CHK 4'b1000 +`define TOKEN_CHK_STRM 4'b1001 +`define TOKEN_FIN 4'b1010 +`define DATA_FIN 4'b1011 +`define DATA_CHK_STRM 4'b1100 +`define TOKEN_WAIT_CRC 4'b1101 +`define DATA_WAIT_CRC 4'b1110 + +reg [3:0] CurrState_prRxByte; +reg [3:0] NextState_prRxByte; + +// Diagram actions (continuous assignments allowed only: assign ...) + +always @ +(next_CRCError or next_bitStuffError or + next_RxOverflow or next_NAKRxed or + next_stallRxed or next_ACKRxed or + next_dataSequence) +begin + RxStatus <= + {1'b0, next_dataSequence, + next_ACKRxed, + next_stallRxed, next_NAKRxed, + next_RxOverflow, + next_bitStuffError, next_CRCError }; +end + +//-------------------------------------------------------------------- +// Machine: prRxByte +//-------------------------------------------------------------------- +//---------------------------------- +// Next State Logic (combinatorial) +//---------------------------------- +always @ (RxByteIn or RxCtrlIn or RxCtrl or RxStatus or RxByte or RXDataByteCnt or CRC16Result or CRC5Result or RXByteStMachCurrState or processRxDataInWEn or CRC16UpdateRdy or CRC5UpdateRdy or CRCError or bitStuffError or RxOverflow or RxTimeOut or NAKRxed or stallRxed or ACKRxed or dataSequence or RxDataOut or RxCtrlOut or RxDataOutWEn or rstCRC or CRCData or CRC5En or CRC5_8Bit or CRC16En or processRxByteRdy or CurrState_prRxByte) +begin : prRxByte_NextState + NextState_prRxByte <= CurrState_prRxByte; + // Set default values for outputs and signals + next_RxByte <= RxByte; + next_RxCtrl <= RxCtrl; + next_RXByteStMachCurrState <= RXByteStMachCurrState; + next_CRCError <= CRCError; + next_bitStuffError <= bitStuffError; + next_RxOverflow <= RxOverflow; + next_RxTimeOut <= RxTimeOut; + next_NAKRxed <= NAKRxed; + next_stallRxed <= stallRxed; + next_ACKRxed <= ACKRxed; + next_dataSequence <= dataSequence; + next_RxDataOut <= RxDataOut; + next_RxCtrlOut <= RxCtrlOut; + next_RxDataOutWEn <= RxDataOutWEn; + next_rstCRC <= rstCRC; + next_CRCData <= CRCData; + next_CRC5En <= CRC5En; + next_CRC5_8Bit <= CRC5_8Bit; + next_CRC16En <= CRC16En; + next_RXDataByteCnt <= RXDataByteCnt; + next_processRxByteRdy <= processRxByteRdy; + case (CurrState_prRxByte) + `CHK_ST: + if (RXByteStMachCurrState == `HS_BYTE_ST) + NextState_prRxByte <= `HSHAKE_CHK; + else if (RXByteStMachCurrState == `TOKEN_BYTE_ST) + NextState_prRxByte <= `TOKEN_WAIT_CRC; + else if (RXByteStMachCurrState == `DATA_BYTE_ST) + NextState_prRxByte <= `DATA_WAIT_CRC; + else if (RXByteStMachCurrState == `IDLE_BYTE_ST) + NextState_prRxByte <= `IDLE_CHK_START; + else if (RXByteStMachCurrState == `CHECK_SYNC_ST) + NextState_prRxByte <= `CHK_SYNC_DO; + else if (RXByteStMachCurrState == `CHECK_PID_ST) + NextState_prRxByte <= `CHK_PID_DO_CHK; + `START_PRBY: + begin + next_RxByte <= 8'h00; + next_RxCtrl <= 8'h00; + next_RXByteStMachCurrState <= `IDLE_BYTE_ST; + next_CRCError <= 1'b0; + next_bitStuffError <= 1'b0; + next_RxOverflow <= 1'b0; + next_RxTimeOut <= 1'b0; + next_NAKRxed <= 1'b0; + next_stallRxed <= 1'b0; + next_ACKRxed <= 1'b0; + next_dataSequence <= 1'b0; + next_RxDataOut <= 8'h00; + next_RxCtrlOut <= 8'h00; + next_RxDataOutWEn <= 1'b0; + next_rstCRC <= 1'b0; + next_CRCData <= 8'h00; + next_CRC5En <= 1'b0; + next_CRC5_8Bit <= 1'b0; + next_CRC16En <= 1'b0; + next_RXDataByteCnt <= 10'h00; + next_processRxByteRdy <= 1'b1; + NextState_prRxByte <= `WAIT_BYTE; + end + `WAIT_BYTE: + if (processRxDataInWEn == 1'b1) + begin + NextState_prRxByte <= `CHK_ST; + next_RxByte <= RxByteIn; + next_RxCtrl <= RxCtrlIn; + next_processRxByteRdy <= 1'b0; + end + `HSHAKE_FIN: + begin + next_RxDataOutWEn <= 1'b0; + next_RXByteStMachCurrState <= `IDLE_BYTE_ST; + NextState_prRxByte <= `WAIT_BYTE; + next_processRxByteRdy <= 1'b1; + end + `HSHAKE_CHK: + begin + NextState_prRxByte <= `HSHAKE_FIN; + if (RxCtrl != `DATA_STOP) //If more than PID rxed, then report error + next_RxOverflow <= 1'b1; + next_RxDataOut <= RxStatus; + next_RxCtrlOut <= `RX_PACKET_STOP; + next_RxDataOutWEn <= 1'b1; + end + `CHK_PID_DO_CHK: + if ((RxByte[7:4] ^ RxByte[3:0] ) != 4'hf) + begin + NextState_prRxByte <= `WAIT_BYTE; + next_RXByteStMachCurrState <= `IDLE_BYTE_ST; + next_processRxByteRdy <= 1'b1; + end + else + begin + NextState_prRxByte <= `CHK_PID_FIRST_BYTE_PROC; + next_CRCError <= 1'b0; + next_bitStuffError <= 1'b0; + next_RxOverflow <= 1'b0; + next_NAKRxed <= 1'b0; + next_stallRxed <= 1'b0; + next_ACKRxed <= 1'b0; + next_dataSequence <= 1'b0; + next_RxTimeOut <= 1'b0; + next_RXDataByteCnt <= 10'h000; + next_RxDataOut <= RxByte; + next_RxCtrlOut <= `RX_PACKET_START; + next_RxDataOutWEn <= 1'b1; + next_rstCRC <= 1'b1; + end + `CHK_PID_FIRST_BYTE_PROC: + begin + next_rstCRC <= 1'b0; + next_RxDataOutWEn <= 1'b0; + case (RxByte[1:0] ) + `SPECIAL: //Special PID. + next_RXByteStMachCurrState <= `IDLE_BYTE_ST; + `TOKEN: //Token PID + begin + next_RXByteStMachCurrState <= `TOKEN_BYTE_ST; + next_RXDataByteCnt <= 0; + end + `HANDSHAKE: //Handshake PID + begin + case (RxByte[3:2] ) + 2'b00: + next_ACKRxed <= 1'b1; + 2'b10: + next_NAKRxed <= 1'b1; + 2'b11: + next_stallRxed <= 1'b1; + default: + begin + $display ("Invalid Handshake PID detected in ProcessRXByte\n"); + end + endcase + next_RXByteStMachCurrState <= `HS_BYTE_ST; + end + `DATA: //Data PID + begin + case (RxByte[3:2] ) + 2'b00: + next_dataSequence <= 1'b0; + 2'b10: + next_dataSequence <= 1'b1; + default: + $display ("Invalid DATA PID detected in ProcessRXByte\n"); + endcase + next_RXByteStMachCurrState <= `DATA_BYTE_ST; + next_RXDataByteCnt <= 0; + end + endcase + NextState_prRxByte <= `WAIT_BYTE; + next_processRxByteRdy <= 1'b1; + end + `DATA_FIN: + begin + next_CRC16En <= 1'b0; + next_RxDataOutWEn <= 1'b0; + NextState_prRxByte <= `WAIT_BYTE; + next_processRxByteRdy <= 1'b1; + end + `DATA_CHK_STRM: + begin + next_RXDataByteCnt <= RXDataByteCnt + 1'b1; + case (RxCtrl) + `DATA_STOP: + begin + if (CRC16Result != 16'hb001) + next_CRCError <= 1'b1; + next_RxDataOut <= RxStatus; + next_RxCtrlOut <= `RX_PACKET_STOP; + next_RXByteStMachCurrState <= `IDLE_BYTE_ST; + end + `DATA_BIT_STUFF_ERROR: + begin + next_bitStuffError <= 1'b1; + next_RxDataOut <= RxStatus; + next_RxCtrlOut <= `RX_PACKET_STOP; + next_RXByteStMachCurrState <= `IDLE_BYTE_ST; + end + `DATA_STREAM: + begin + next_RxDataOut <= RxByte; + next_RxCtrlOut <= `RX_PACKET_STREAM; + next_CRCData <= RxByte; + next_CRC16En <= 1'b1; + end + default: + begin + next_RXByteStMachCurrState <= `IDLE_BYTE_ST; + end + endcase + next_RxDataOutWEn <= 1'b1; + NextState_prRxByte <= `DATA_FIN; + end + `DATA_WAIT_CRC: + if (CRC16UpdateRdy == 1'b1) + NextState_prRxByte <= `DATA_CHK_STRM; + `TOKEN_CHK_STRM: + begin + next_RXDataByteCnt <= RXDataByteCnt + 1'b1; + case (RxCtrl) + `DATA_STOP: + begin + if (CRC5Result != 5'h6) + next_CRCError <= 1'b1; + next_RxDataOut <= RxStatus; + next_RxCtrlOut <= `RX_PACKET_STOP; + next_RXByteStMachCurrState <= `IDLE_BYTE_ST; + end + `DATA_BIT_STUFF_ERROR: + begin + next_bitStuffError <= 1'b1; + next_RxDataOut <= RxStatus; + next_RxCtrlOut <= `RX_PACKET_STOP; + next_RXByteStMachCurrState <= `IDLE_BYTE_ST; + end + `DATA_STREAM: + begin + if (RXDataByteCnt > 10'h2) + begin + next_RxOverflow <= 1'b1; + next_RxDataOut <= RxStatus; + next_RxCtrlOut <= `RX_PACKET_STOP; + next_RXByteStMachCurrState <= `IDLE_BYTE_ST; + end + else + begin + next_RxDataOut <= RxByte; + next_RxCtrlOut <= `RX_PACKET_STREAM; + next_CRCData <= RxByte; + next_CRC5_8Bit <= 1'b1; + next_CRC5En <= 1'b1; + end + end + default: + begin + next_RXByteStMachCurrState <= `IDLE_BYTE_ST; + end + endcase + next_RxDataOutWEn <= 1'b1; + NextState_prRxByte <= `TOKEN_FIN; + end + `TOKEN_FIN: + begin + next_CRC5En <= 1'b0; + next_RxDataOutWEn <= 1'b0; + NextState_prRxByte <= `WAIT_BYTE; + next_processRxByteRdy <= 1'b1; + end + `TOKEN_WAIT_CRC: + if (CRC5UpdateRdy == 1'b1) + NextState_prRxByte <= `TOKEN_CHK_STRM; + `CHK_SYNC_DO: + begin + if (RxByte == `SYNC_BYTE) + next_RXByteStMachCurrState <= `CHECK_PID_ST; + else + next_RXByteStMachCurrState <= `IDLE_BYTE_ST; + NextState_prRxByte <= `WAIT_BYTE; + next_processRxByteRdy <= 1'b1; + end + `IDLE_CHK_START: + begin + if (RxCtrl == `DATA_START) + next_RXByteStMachCurrState <= `CHECK_SYNC_ST; + NextState_prRxByte <= `WAIT_BYTE; + next_processRxByteRdy <= 1'b1; + end + endcase +end + +//---------------------------------- +// Current State Logic (sequential) +//---------------------------------- +always @ (posedge clk) +begin : prRxByte_CurrentState + if (rst) + CurrState_prRxByte <= `START_PRBY; + else + CurrState_prRxByte <= NextState_prRxByte; +end + +//---------------------------------- +// Registered outputs logic +//---------------------------------- +always @ (posedge clk) +begin : prRxByte_RegOutput + if (rst) + begin + RxByte <= 8'h00; + RxCtrl <= 8'h00; + RXByteStMachCurrState <= `IDLE_BYTE_ST; + CRCError <= 1'b0; + bitStuffError <= 1'b0; + RxOverflow <= 1'b0; + RxTimeOut <= 1'b0; + NAKRxed <= 1'b0; + stallRxed <= 1'b0; + ACKRxed <= 1'b0; + dataSequence <= 1'b0; + RXDataByteCnt <= 10'h00; + RxDataOut <= 8'h00; + RxCtrlOut <= 8'h00; + RxDataOutWEn <= 1'b0; + rstCRC <= 1'b0; + CRCData <= 8'h00; + CRC5En <= 1'b0; + CRC5_8Bit <= 1'b0; + CRC16En <= 1'b0; + processRxByteRdy <= 1'b1; + end + else + begin + RxByte <= next_RxByte; + RxCtrl <= next_RxCtrl; + RXByteStMachCurrState <= next_RXByteStMachCurrState; + CRCError <= next_CRCError; + bitStuffError <= next_bitStuffError; + RxOverflow <= next_RxOverflow; + RxTimeOut <= next_RxTimeOut; + NAKRxed <= next_NAKRxed; + stallRxed <= next_stallRxed; + ACKRxed <= next_ACKRxed; + dataSequence <= next_dataSequence; + RXDataByteCnt <= next_RXDataByteCnt; + RxDataOut <= next_RxDataOut; + RxCtrlOut <= next_RxCtrlOut; + RxDataOutWEn <= next_RxDataOutWEn; + rstCRC <= next_rstCRC; + CRCData <= next_CRCData; + CRC5En <= next_CRC5En; + CRC5_8Bit <= next_CRC5_8Bit; + CRC16En <= next_CRC16En; + processRxByteRdy <= next_processRxByteRdy; + end +end + +endmodule \ No newline at end of file Index: Actel/usbDeviceActelTop/hdl/hostSlaveMuxBI.v =================================================================== --- Actel/usbDeviceActelTop/hdl/hostSlaveMuxBI.v (nonexistent) +++ Actel/usbDeviceActelTop/hdl/hostSlaveMuxBI.v (revision 40) @@ -0,0 +1,124 @@ +////////////////////////////////////////////////////////////////////// +//// //// +//// hostSlaveMuxBI.v //// +//// //// +//// This file is part of the usbhostslave opencores effort. +//// //// +//// //// +//// Module Description: //// +//// +//// //// +//// To Do: //// +//// +//// //// +//// Author(s): //// +//// - Steve Fielding, sfielding@base2designs.com //// +//// //// +////////////////////////////////////////////////////////////////////// +//// //// +//// Copyright (C) 2004 Steve Fielding and OPENCORES.ORG //// +//// //// +//// This source file may be used and distributed without //// +//// restriction provided that this copyright statement is not //// +//// removed from the file and that any derivative work contains //// +//// the original copyright notice and the associated disclaimer. //// +//// //// +//// This source file is free software; you can redistribute it //// +//// and/or modify it under the terms of the GNU Lesser General //// +//// Public License as published by the Free Software Foundation; //// +//// either version 2.1 of the License, or (at your option) any //// +//// later version. //// +//// //// +//// This source is distributed in the hope that it will be //// +//// useful, but WITHOUT ANY WARRANTY; without even the implied //// +//// warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR //// +//// PURPOSE. See the GNU Lesser General Public License for more //// +//// details. //// +//// //// +//// You should have received a copy of the GNU Lesser General //// +//// Public License along with this source; if not, download it //// +//// from //// +//// //// +////////////////////////////////////////////////////////////////////// +// +`include "timescale.v" +`include "usbHostSlave_h.v" + +module hostSlaveMuxBI (dataIn, dataOut, address, writeEn, strobe_i, busClk, usbClk, + hostMode, hostSlaveMuxSel, rstFromWire, rstSyncToBusClkOut, rstSyncToUsbClkOut); + +input [7:0] dataIn; +input address; +input writeEn; +input strobe_i; +input busClk; +input usbClk; +output [7:0] dataOut; +input hostSlaveMuxSel; +output hostMode; +input rstFromWire; +output rstSyncToBusClkOut; +output rstSyncToUsbClkOut; + +wire [7:0] dataIn; +wire address; +wire writeEn; +wire strobe_i; +wire busClk; +wire usbClk; +reg [7:0] dataOut; +wire hostSlaveMuxSel; +reg hostMode; +wire rstFromWire; +reg rstSyncToBusClkOut; +reg rstSyncToUsbClkOut; + +//internal wire and regs +reg [5:0] rstShift; +reg rstFromBus; +reg rstSyncToUsbClkFirst; + +//sync write demux +always @(posedge busClk) +begin + if (rstSyncToBusClkOut == 1'b1) + hostMode <= 1'b0; + else begin + if (writeEn == 1'b1 && hostSlaveMuxSel == 1'b1 && strobe_i == 1'b1 && address == `HOST_SLAVE_CONTROL_REG ) + hostMode <= dataIn[0]; + end + if (writeEn == 1'b1 && hostSlaveMuxSel == 1'b1 && strobe_i == 1'b1 && address == `HOST_SLAVE_CONTROL_REG && dataIn[1] == 1'b1 ) + rstFromBus <= 1'b1; + else + rstFromBus <= 1'b0; +end + +// async read mux +always @(address or hostMode) +begin + case (address) + `HOST_SLAVE_CONTROL_REG: dataOut <= {7'h0, hostMode}; + `HOST_SLAVE_VERSION_REG: dataOut <= `USBHOSTSLAVE_VERSION_NUM; + endcase +end + +// reset control +//generate 'rstSyncToBusClk' +//assuming that 'busClk' < 5 * 'usbClk'. ie 'busClk' < 240MHz +always @(posedge busClk) begin + if (rstFromWire == 1'b1 || rstFromBus == 1'b1) + rstShift <= 6'b111111; + else + rstShift <= {1'b0, rstShift[5:1]}; +end + +always @(rstShift) + rstSyncToBusClkOut <= rstShift[0]; + +// double sync across clock domains to generate 'forceEmptySyncToWrClk' +always @(posedge usbClk) begin + rstSyncToUsbClkFirst <= rstSyncToBusClkOut; + rstSyncToUsbClkOut <= rstSyncToUsbClkFirst; +end + +endmodule Index: Actel/usbDeviceActelTop/hdl/slavecontroller.v =================================================================== --- Actel/usbDeviceActelTop/hdl/slavecontroller.v (nonexistent) +++ Actel/usbDeviceActelTop/hdl/slavecontroller.v (revision 40) @@ -0,0 +1,475 @@ + +// File : ../RTL/slaveController/slavecontroller.v +// Generated : 11/10/06 05:37:25 +// From : ../RTL/slaveController/slavecontroller.asf +// By : FSM2VHDL ver. 5.0.0.9 + +////////////////////////////////////////////////////////////////////// +//// //// +//// slaveController +//// //// +//// This file is part of the usbhostslave opencores effort. +//// http://www.opencores.org/cores/usbhostslave/ //// +//// //// +//// Module Description: //// +//// +//// //// +//// To Do: //// +//// +//// //// +//// Author(s): //// +//// - Steve Fielding, sfielding@base2designs.com //// +//// //// +////////////////////////////////////////////////////////////////////// +//// //// +//// Copyright (C) 2004 Steve Fielding and OPENCORES.ORG //// +//// //// +//// This source file may be used and distributed without //// +//// restriction provided that this copyright statement is not //// +//// removed from the file and that any derivative work contains //// +//// the original copyright notice and the associated disclaimer. //// +//// //// +//// This source file is free software; you can redistribute it //// +//// and/or modify it under the terms of the GNU Lesser General //// +//// Public License as published by the Free Software Foundation; //// +//// either version 2.1 of the License, or (at your option) any //// +//// later version. //// +//// //// +//// This source is distributed in the hope that it will be //// +//// useful, but WITHOUT ANY WARRANTY; without even the implied //// +//// warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR //// +//// PURPOSE. See the GNU Lesser General Public License for more //// +//// details. //// +//// //// +//// You should have received a copy of the GNU Lesser General //// +//// Public License along with this source; if not, download it //// +//// from http://www.opencores.org/lgpl.shtml //// +//// //// +////////////////////////////////////////////////////////////////////// +// +`include "timescale.v" +`include "usbSerialInterfaceEngine_h.v" +`include "usbSlaveControl_h.v" +`include "usbConstants_h.v" + + +module slavecontroller (CRCError, NAKSent, RxByte, RxDataWEn, RxOverflow, RxStatus, RxTimeOut, SCGlobalEn, SOFRxed, USBEndPControlReg, USBEndPNakTransTypeReg, USBEndPTransTypeReg, USBEndP, USBTgtAddress, bitStuffError, clk, clrEPRdy, endPMuxErrorsWEn, endPointReadyToGetPkt, frameNum, getPacketREn, getPacketRdy, rst, sendPacketPID, sendPacketRdy, sendPacketWEn, stallSent, transDone); +input CRCError; +input [7:0] RxByte; +input RxDataWEn; +input RxOverflow; +input [7:0] RxStatus; +input RxTimeOut; +input SCGlobalEn; +input [4:0] USBEndPControlReg; +input [6:0] USBTgtAddress; +input bitStuffError; +input clk; +input getPacketRdy; +input rst; +input sendPacketRdy; +output NAKSent; +output SOFRxed; +output [1:0] USBEndPNakTransTypeReg; +output [1:0] USBEndPTransTypeReg; +output [3:0] USBEndP; +output clrEPRdy; +output endPMuxErrorsWEn; +output endPointReadyToGetPkt; +output [10:0] frameNum; +output getPacketREn; +output [3:0] sendPacketPID; +output sendPacketWEn; +output stallSent; +output transDone; + +wire CRCError; +reg NAKSent, next_NAKSent; +wire [7:0] RxByte; +wire RxDataWEn; +wire RxOverflow; +wire [7:0] RxStatus; +wire RxTimeOut; +wire SCGlobalEn; +reg SOFRxed, next_SOFRxed; +wire [4:0] USBEndPControlReg; +reg [1:0] USBEndPNakTransTypeReg, next_USBEndPNakTransTypeReg; +reg [1:0] USBEndPTransTypeReg, next_USBEndPTransTypeReg; +reg [3:0] USBEndP, next_USBEndP; +wire [6:0] USBTgtAddress; +wire bitStuffError; +wire clk; +reg clrEPRdy, next_clrEPRdy; +reg endPMuxErrorsWEn, next_endPMuxErrorsWEn; +reg endPointReadyToGetPkt, next_endPointReadyToGetPkt; +reg [10:0] frameNum, next_frameNum; +reg getPacketREn, next_getPacketREn; +wire getPacketRdy; +wire rst; +reg [3:0] sendPacketPID, next_sendPacketPID; +wire sendPacketRdy; +reg sendPacketWEn, next_sendPacketWEn; +reg stallSent, next_stallSent; +reg transDone, next_transDone; + +// diagram signals declarations +reg [7:0]PIDByte, next_PIDByte; +reg [6:0]USBAddress, next_USBAddress; +reg [4:0]USBEndPControlRegCopy, next_USBEndPControlRegCopy; +reg [7:0]addrEndPTemp, next_addrEndPTemp; +reg [7:0]endpCRCTemp, next_endpCRCTemp; +reg [1:0]tempUSBEndPTransTypeReg, next_tempUSBEndPTransTypeReg; + +// BINARY ENCODED state machine: slvCntrl +// State codes definitions: +`define WAIT_RX1 5'b00000 +`define FIN_SC 5'b00001 +`define GET_TOKEN_WAIT_CRC 5'b00010 +`define GET_TOKEN_WAIT_ADDR 5'b00011 +`define GET_TOKEN_WAIT_STOP 5'b00100 +`define CHK_PID 5'b00101 +`define GET_TOKEN_CHK_SOF 5'b00110 +`define PID_ERROR 5'b00111 +`define CHK_RDY 5'b01000 +`define IN_NAK_STALL 5'b01001 +`define IN_CHK_RDY 5'b01010 +`define SETUP_OUT_CHK 5'b01011 +`define SETUP_OUT_SEND 5'b01100 +`define SETUP_OUT_GET_PKT 5'b01101 +`define START_S1 5'b01110 +`define GET_TOKEN_DELAY 5'b01111 +`define GET_TOKEN_CHK_ADDR 5'b10000 +`define IN_RESP_GET_RESP 5'b10001 +`define IN_RESP_DATA 5'b10010 +`define IN_RESP_CHK_ISO 5'b10011 + +reg [4:0] CurrState_slvCntrl; +reg [4:0] NextState_slvCntrl; + + +//-------------------------------------------------------------------- +// Machine: slvCntrl +//-------------------------------------------------------------------- +//---------------------------------- +// Next State Logic (combinatorial) +//---------------------------------- +always @ (RxByte or tempUSBEndPTransTypeReg or endpCRCTemp or addrEndPTemp or USBEndPControlReg or RxDataWEn or RxStatus or PIDByte or USBEndPControlRegCopy or NAKSent or sendPacketRdy or getPacketRdy or CRCError or bitStuffError or RxOverflow or RxTimeOut or USBEndP or USBAddress or USBTgtAddress or SCGlobalEn or stallSent or SOFRxed or transDone or clrEPRdy or endPMuxErrorsWEn or getPacketREn or sendPacketWEn or sendPacketPID or USBEndPTransTypeReg or USBEndPNakTransTypeReg or frameNum or endPointReadyToGetPkt or CurrState_slvCntrl) +begin : slvCntrl_NextState + NextState_slvCntrl <= CurrState_slvCntrl; + // Set default values for outputs and signals + next_stallSent <= stallSent; + next_NAKSent <= NAKSent; + next_SOFRxed <= SOFRxed; + next_PIDByte <= PIDByte; + next_transDone <= transDone; + next_clrEPRdy <= clrEPRdy; + next_endPMuxErrorsWEn <= endPMuxErrorsWEn; + next_tempUSBEndPTransTypeReg <= tempUSBEndPTransTypeReg; + next_getPacketREn <= getPacketREn; + next_sendPacketWEn <= sendPacketWEn; + next_sendPacketPID <= sendPacketPID; + next_USBEndPTransTypeReg <= USBEndPTransTypeReg; + next_USBEndPNakTransTypeReg <= USBEndPNakTransTypeReg; + next_endpCRCTemp <= endpCRCTemp; + next_addrEndPTemp <= addrEndPTemp; + next_frameNum <= frameNum; + next_USBAddress <= USBAddress; + next_USBEndP <= USBEndP; + next_USBEndPControlRegCopy <= USBEndPControlRegCopy; + next_endPointReadyToGetPkt <= endPointReadyToGetPkt; + case (CurrState_slvCntrl) + `WAIT_RX1: + begin + next_stallSent <= 1'b0; + next_NAKSent <= 1'b0; + next_SOFRxed <= 1'b0; + if (RxDataWEn == 1'b1 && + RxStatus == `RX_PACKET_START && + RxByte[1:0] == `TOKEN) + begin + NextState_slvCntrl <= `GET_TOKEN_WAIT_ADDR; + next_PIDByte <= RxByte; + end + end + `FIN_SC: + begin + next_transDone <= 1'b0; + next_clrEPRdy <= 1'b0; + next_endPMuxErrorsWEn <= 1'b0; + NextState_slvCntrl <= `WAIT_RX1; + end + `CHK_PID: + if (PIDByte[3:0] == `SETUP) + begin + NextState_slvCntrl <= `SETUP_OUT_GET_PKT; + next_tempUSBEndPTransTypeReg <= `SC_SETUP_TRANS; + next_getPacketREn <= 1'b1; + end + else if (PIDByte[3:0] == `OUT) + begin + NextState_slvCntrl <= `SETUP_OUT_GET_PKT; + next_tempUSBEndPTransTypeReg <= `SC_OUTDATA_TRANS; + next_getPacketREn <= 1'b1; + end + else if ((PIDByte[3:0] == `IN) && (USBEndPControlRegCopy[`ENDPOINT_ISO_ENABLE_BIT] == 1'b0)) + begin + NextState_slvCntrl <= `IN_CHK_RDY; + next_tempUSBEndPTransTypeReg <= `SC_IN_TRANS; + end + else if (((PIDByte[3:0] == `IN) && (USBEndPControlRegCopy [`ENDPOINT_READY_BIT] == 1'b1)) && (USBEndPControlRegCopy [`ENDPOINT_OUTDATA_SEQUENCE_BIT] == 1'b0)) + begin + NextState_slvCntrl <= `IN_RESP_DATA; + next_tempUSBEndPTransTypeReg <= `SC_IN_TRANS; + next_sendPacketWEn <= 1'b1; + next_sendPacketPID <= `DATA0; + end + else if ((PIDByte[3:0] == `IN) && (USBEndPControlRegCopy [`ENDPOINT_READY_BIT] == 1'b1)) + begin + NextState_slvCntrl <= `IN_RESP_DATA; + next_tempUSBEndPTransTypeReg <= `SC_IN_TRANS; + next_sendPacketWEn <= 1'b1; + next_sendPacketPID <= `DATA1; + end + else if (PIDByte[3:0] == `IN) + begin + NextState_slvCntrl <= `CHK_RDY; + next_tempUSBEndPTransTypeReg <= `SC_IN_TRANS; + end + else + NextState_slvCntrl <= `PID_ERROR; + `PID_ERROR: + NextState_slvCntrl <= `WAIT_RX1; + `CHK_RDY: + if (USBEndPControlRegCopy [`ENDPOINT_READY_BIT] == 1'b1) + begin + NextState_slvCntrl <= `FIN_SC; + next_transDone <= 1'b1; + next_clrEPRdy <= 1'b1; + next_USBEndPTransTypeReg <= tempUSBEndPTransTypeReg; + next_endPMuxErrorsWEn <= 1'b1; + end + else if (NAKSent == 1'b1) + begin + NextState_slvCntrl <= `FIN_SC; + next_USBEndPNakTransTypeReg <= tempUSBEndPTransTypeReg; + next_endPMuxErrorsWEn <= 1'b1; + end + else + NextState_slvCntrl <= `FIN_SC; + `SETUP_OUT_CHK: + if (USBEndPControlRegCopy [`ENDPOINT_READY_BIT] == 1'b0) + begin + NextState_slvCntrl <= `SETUP_OUT_SEND; + next_sendPacketWEn <= 1'b1; + next_sendPacketPID <= `NAK; + next_NAKSent <= 1'b1; + end + else if (USBEndPControlRegCopy [`ENDPOINT_SEND_STALL_BIT] == 1'b1) + begin + NextState_slvCntrl <= `SETUP_OUT_SEND; + next_sendPacketWEn <= 1'b1; + next_sendPacketPID <= `STALL; + next_stallSent <= 1'b1; + end + else + begin + NextState_slvCntrl <= `SETUP_OUT_SEND; + next_sendPacketWEn <= 1'b1; + next_sendPacketPID <= `ACK; + end + `SETUP_OUT_SEND: + begin + next_sendPacketWEn <= 1'b0; + if (sendPacketRdy == 1'b1) + NextState_slvCntrl <= `CHK_RDY; + end + `SETUP_OUT_GET_PKT: + begin + next_getPacketREn <= 1'b0; + if ((getPacketRdy == 1'b1) && (USBEndPControlRegCopy [`ENDPOINT_ISO_ENABLE_BIT] == 1'b1)) + NextState_slvCntrl <= `CHK_RDY; + else if ((getPacketRdy == 1'b1) && (CRCError == 1'b0 && + bitStuffError == 1'b0 && + RxOverflow == 1'b0 && + RxTimeOut == 1'b0)) + NextState_slvCntrl <= `SETUP_OUT_CHK; + else if (getPacketRdy == 1'b1) + NextState_slvCntrl <= `CHK_RDY; + end + `IN_NAK_STALL: + begin + next_sendPacketWEn <= 1'b0; + if (sendPacketRdy == 1'b1) + NextState_slvCntrl <= `CHK_RDY; + end + `IN_CHK_RDY: + if (USBEndPControlRegCopy [`ENDPOINT_READY_BIT] == 1'b0) + begin + NextState_slvCntrl <= `IN_NAK_STALL; + next_sendPacketWEn <= 1'b1; + next_sendPacketPID <= `NAK; + next_NAKSent <= 1'b1; + end + else if (USBEndPControlRegCopy [`ENDPOINT_SEND_STALL_BIT] == 1'b1) + begin + NextState_slvCntrl <= `IN_NAK_STALL; + next_sendPacketWEn <= 1'b1; + next_sendPacketPID <= `STALL; + next_stallSent <= 1'b1; + end + else if (USBEndPControlRegCopy [`ENDPOINT_OUTDATA_SEQUENCE_BIT] == 1'b0) + begin + NextState_slvCntrl <= `IN_RESP_DATA; + next_sendPacketWEn <= 1'b1; + next_sendPacketPID <= `DATA0; + end + else + begin + NextState_slvCntrl <= `IN_RESP_DATA; + next_sendPacketWEn <= 1'b1; + next_sendPacketPID <= `DATA1; + end + `IN_RESP_GET_RESP: + begin + next_getPacketREn <= 1'b0; + if (getPacketRdy == 1'b1) + NextState_slvCntrl <= `CHK_RDY; + end + `IN_RESP_DATA: + begin + next_sendPacketWEn <= 1'b0; + if (sendPacketRdy == 1'b1) + NextState_slvCntrl <= `IN_RESP_CHK_ISO; + end + `IN_RESP_CHK_ISO: + if (USBEndPControlRegCopy [`ENDPOINT_ISO_ENABLE_BIT] == 1'b1) + NextState_slvCntrl <= `CHK_RDY; + else + begin + NextState_slvCntrl <= `IN_RESP_GET_RESP; + next_getPacketREn <= 1'b1; + end + `START_S1: + NextState_slvCntrl <= `WAIT_RX1; + `GET_TOKEN_WAIT_CRC: + if (RxDataWEn == 1'b1 && + RxStatus == `RX_PACKET_STREAM) + begin + NextState_slvCntrl <= `GET_TOKEN_WAIT_STOP; + next_endpCRCTemp <= RxByte; + end + else if (RxDataWEn == 1'b1 && + RxStatus != `RX_PACKET_STREAM) + NextState_slvCntrl <= `WAIT_RX1; + `GET_TOKEN_WAIT_ADDR: + if (RxDataWEn == 1'b1 && + RxStatus == `RX_PACKET_STREAM) + begin + NextState_slvCntrl <= `GET_TOKEN_WAIT_CRC; + next_addrEndPTemp <= RxByte; + end + else if (RxDataWEn == 1'b1 && + RxStatus != `RX_PACKET_STREAM) + NextState_slvCntrl <= `WAIT_RX1; + `GET_TOKEN_WAIT_STOP: + if ((RxDataWEn == 1'b1) && (RxByte[`CRC_ERROR_BIT] == 1'b0 && + RxByte[`BIT_STUFF_ERROR_BIT] == 1'b0 && + RxByte [`RX_OVERFLOW_BIT] == 1'b0)) + NextState_slvCntrl <= `GET_TOKEN_CHK_SOF; + else if (RxDataWEn == 1'b1) + NextState_slvCntrl <= `WAIT_RX1; + `GET_TOKEN_CHK_SOF: + if (PIDByte[3:0] == `SOF) + begin + NextState_slvCntrl <= `WAIT_RX1; + next_frameNum <= {endpCRCTemp[2:0],addrEndPTemp}; + next_SOFRxed <= 1'b1; + end + else + begin + NextState_slvCntrl <= `GET_TOKEN_DELAY; + next_USBAddress <= addrEndPTemp[6:0]; + next_USBEndP <= { endpCRCTemp[2:0], addrEndPTemp[7]}; + end + `GET_TOKEN_DELAY: // Insert delay to allow USBEndP etc to update + NextState_slvCntrl <= `GET_TOKEN_CHK_ADDR; + `GET_TOKEN_CHK_ADDR: + if (USBEndP < `NUM_OF_ENDPOINTS && + USBAddress == USBTgtAddress && + SCGlobalEn == 1'b1 && + USBEndPControlReg[`ENDPOINT_ENABLE_BIT] == 1'b1) + begin + NextState_slvCntrl <= `CHK_PID; + next_USBEndPControlRegCopy <= USBEndPControlReg; + next_endPointReadyToGetPkt <= USBEndPControlReg [`ENDPOINT_READY_BIT]; + end + else + NextState_slvCntrl <= `WAIT_RX1; + endcase +end + +//---------------------------------- +// Current State Logic (sequential) +//---------------------------------- +always @ (posedge clk) +begin : slvCntrl_CurrentState + if (rst) + CurrState_slvCntrl <= `START_S1; + else + CurrState_slvCntrl <= NextState_slvCntrl; +end + +//---------------------------------- +// Registered outputs logic +//---------------------------------- +always @ (posedge clk) +begin : slvCntrl_RegOutput + if (rst) + begin + tempUSBEndPTransTypeReg <= 2'b00; + addrEndPTemp <= 8'h00; + endpCRCTemp <= 8'h00; + USBAddress <= 7'b0000000; + PIDByte <= 8'h00; + USBEndPControlRegCopy <= 5'b00000; + transDone <= 1'b0; + getPacketREn <= 1'b0; + sendPacketPID <= 4'b0; + sendPacketWEn <= 1'b0; + clrEPRdy <= 1'b0; + USBEndPTransTypeReg <= 2'b00; + USBEndPNakTransTypeReg <= 2'b00; + NAKSent <= 1'b0; + stallSent <= 1'b0; + SOFRxed <= 1'b0; + endPMuxErrorsWEn <= 1'b0; + frameNum <= 11'b00000000000; + USBEndP <= 4'h0; + endPointReadyToGetPkt <= 1'b0; + end + else + begin + tempUSBEndPTransTypeReg <= next_tempUSBEndPTransTypeReg; + addrEndPTemp <= next_addrEndPTemp; + endpCRCTemp <= next_endpCRCTemp; + USBAddress <= next_USBAddress; + PIDByte <= next_PIDByte; + USBEndPControlRegCopy <= next_USBEndPControlRegCopy; + transDone <= next_transDone; + getPacketREn <= next_getPacketREn; + sendPacketPID <= next_sendPacketPID; + sendPacketWEn <= next_sendPacketWEn; + clrEPRdy <= next_clrEPRdy; + USBEndPTransTypeReg <= next_USBEndPTransTypeReg; + USBEndPNakTransTypeReg <= next_USBEndPNakTransTypeReg; + NAKSent <= next_NAKSent; + stallSent <= next_stallSent; + SOFRxed <= next_SOFRxed; + endPMuxErrorsWEn <= next_endPMuxErrorsWEn; + frameNum <= next_frameNum; + USBEndP <= next_USBEndP; + endPointReadyToGetPkt <= next_endPointReadyToGetPkt; + end +end + +endmodule \ No newline at end of file Index: Actel/usbDeviceActelTop/hdl/processTxByte.v =================================================================== --- Actel/usbDeviceActelTop/hdl/processTxByte.v (nonexistent) +++ Actel/usbDeviceActelTop/hdl/processTxByte.v (revision 40) @@ -0,0 +1,448 @@ + +// File : ../RTL/serialInterfaceEngine/processTxByte.v +// Generated : 11/10/06 05:37:23 +// From : ../RTL/serialInterfaceEngine/processTxByte.asf +// By : FSM2VHDL ver. 5.0.0.9 + +////////////////////////////////////////////////////////////////////// +//// //// +//// processTxByte +//// //// +//// This file is part of the usbhostslave opencores effort. +//// http://www.opencores.org/cores/usbhostslave/ //// +//// //// +//// Module Description: //// +//// +//// //// +//// To Do: //// +//// +//// //// +//// Author(s): //// +//// - Steve Fielding, sfielding@base2designs.com //// +//// //// +////////////////////////////////////////////////////////////////////// +//// //// +//// Copyright (C) 2004 Steve Fielding and OPENCORES.ORG //// +//// //// +//// This source file may be used and distributed without //// +//// restriction provided that this copyright statement is not //// +//// removed from the file and that any derivative work contains //// +//// the original copyright notice and the associated disclaimer. //// +//// //// +//// This source file is free software; you can redistribute it //// +//// and/or modify it under the terms of the GNU Lesser General //// +//// Public License as published by the Free Software Foundation; //// +//// either version 2.1 of the License, or (at your option) any //// +//// later version. //// +//// //// +//// This source is distributed in the hope that it will be //// +//// useful, but WITHOUT ANY WARRANTY; without even the implied //// +//// warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR //// +//// PURPOSE. See the GNU Lesser General Public License for more //// +//// details. //// +//// //// +//// You should have received a copy of the GNU Lesser General //// +//// Public License along with this source; if not, download it //// +//// from http://www.opencores.org/lgpl.shtml //// +//// //// +////////////////////////////////////////////////////////////////////// +// +`include "timescale.v" +`include "usbSerialInterfaceEngine_h.v" +`include "usbConstants_h.v" + +module processTxByte (JBit, KBit, TxByteCtrlIn, TxByteFullSpeedRateIn, TxByteIn, USBWireCtrl, USBWireData, USBWireFullSpeedRate, USBWireGnt, USBWireRdy, USBWireReq, USBWireWEn, clk, processTxByteRdy, processTxByteWEn, rst); +input [1:0] JBit; +input [1:0] KBit; +input [7:0] TxByteCtrlIn; +input TxByteFullSpeedRateIn; +input [7:0] TxByteIn; +input USBWireGnt; +input USBWireRdy; +input clk; +input processTxByteWEn; +input rst; +output USBWireCtrl; +output [1:0] USBWireData; +output USBWireFullSpeedRate; +output USBWireReq; +output USBWireWEn; +output processTxByteRdy; + +wire [1:0] JBit; +wire [1:0] KBit; +wire [7:0] TxByteCtrlIn; +wire TxByteFullSpeedRateIn; +wire [7:0] TxByteIn; +reg USBWireCtrl, next_USBWireCtrl; +reg [1:0] USBWireData, next_USBWireData; +reg USBWireFullSpeedRate, next_USBWireFullSpeedRate; +wire USBWireGnt; +wire USBWireRdy; +reg USBWireReq, next_USBWireReq; +reg USBWireWEn, next_USBWireWEn; +wire clk; +reg processTxByteRdy, next_processTxByteRdy; +wire processTxByteWEn; +wire rst; + +// diagram signals declarations +reg [1:0]TXLineState, next_TXLineState; +reg [3:0]TXOneCount, next_TXOneCount; +reg [7:0]TxByteCtrl, next_TxByteCtrl; +reg TxByteFullSpeedRate, next_TxByteFullSpeedRate; +reg [7:0]TxByte, next_TxByte; +reg [3:0]i, next_i; + +// BINARY ENCODED state machine: prcTxB +// State codes definitions: +`define START_PTBY 5'b00000 +`define PTBY_WAIT_EN 5'b00001 +`define SEND_BYTE_UPDATE_BYTE 5'b00010 +`define SEND_BYTE_WAIT_RDY 5'b00011 +`define SEND_BYTE_CHK 5'b00100 +`define SEND_BYTE_BIT_STUFF 5'b00101 +`define SEND_BYTE_WAIT_RDY2 5'b00110 +`define SEND_BYTE_CHK_FIN 5'b00111 +`define PTBY_WAIT_GNT 5'b01000 +`define STOP_SND_SE0_2 5'b01001 +`define STOP_SND_SE0_1 5'b01010 +`define STOP_CHK 5'b01011 +`define STOP_SND_J 5'b01100 +`define STOP_SND_IDLE 5'b01101 +`define STOP_FIN 5'b01110 +`define WAIT_RDY_WIRE 5'b01111 +`define WAIT_RDY_PKT 5'b10000 +`define LS_START_SND_IDLE3 5'b10001 +`define LS_START_SND_J1 5'b10010 +`define LS_START_SND_IDLE1 5'b10011 +`define LS_START_SND_IDLE2 5'b10100 +`define LS_START_FIN 5'b10101 +`define LS_START_W_RDY1 5'b10110 +`define LS_START_W_RDY2 5'b10111 +`define LS_START_W_RDY3 5'b11000 +`define STOP_W_RDY1 5'b11001 +`define STOP_W_RDY2 5'b11010 +`define STOP_W_RDY3 5'b11011 +`define STOP_W_RDY4 5'b11100 + +reg [4:0] CurrState_prcTxB; +reg [4:0] NextState_prcTxB; + + +//-------------------------------------------------------------------- +// Machine: prcTxB +//-------------------------------------------------------------------- +//---------------------------------- +// Next State Logic (combinatorial) +//---------------------------------- +always @ (TxByteIn or TxByteCtrlIn or TxByteFullSpeedRateIn or JBit or i or TxByte or TXOneCount or TXLineState or KBit or processTxByteWEn or USBWireGnt or USBWireRdy or TxByteFullSpeedRate or TxByteCtrl or processTxByteRdy or USBWireData or USBWireCtrl or USBWireReq or USBWireWEn or USBWireFullSpeedRate or CurrState_prcTxB) +begin : prcTxB_NextState + NextState_prcTxB <= CurrState_prcTxB; + // Set default values for outputs and signals + next_processTxByteRdy <= processTxByteRdy; + next_USBWireData <= USBWireData; + next_USBWireCtrl <= USBWireCtrl; + next_USBWireReq <= USBWireReq; + next_USBWireWEn <= USBWireWEn; + next_i <= i; + next_TxByte <= TxByte; + next_TxByteCtrl <= TxByteCtrl; + next_TXLineState <= TXLineState; + next_TXOneCount <= TXOneCount; + next_USBWireFullSpeedRate <= USBWireFullSpeedRate; + next_TxByteFullSpeedRate <= TxByteFullSpeedRate; + case (CurrState_prcTxB) + `START_PTBY: + begin + next_processTxByteRdy <= 1'b0; + next_USBWireData <= 2'b00; + next_USBWireCtrl <= `TRI_STATE; + next_USBWireReq <= 1'b0; + next_USBWireWEn <= 1'b0; + next_i <= 4'h0; + next_TxByte <= 8'h00; + next_TxByteCtrl <= 8'h00; + next_TXLineState <= 2'b0; + next_TXOneCount <= 4'h0; + next_USBWireFullSpeedRate <= 1'b0; + next_TxByteFullSpeedRate <= 1'b0; + NextState_prcTxB <= `PTBY_WAIT_EN; + end + `PTBY_WAIT_EN: + begin + next_processTxByteRdy <= 1'b1; + if ((processTxByteWEn == 1'b1) && (TxByteCtrlIn == `DATA_START)) + begin + NextState_prcTxB <= `PTBY_WAIT_GNT; + next_processTxByteRdy <= 1'b0; + next_TxByte <= TxByteIn; + next_TxByteCtrl <= TxByteCtrlIn; + next_TxByteFullSpeedRate <= TxByteFullSpeedRateIn; + next_USBWireFullSpeedRate <= TxByteFullSpeedRateIn; + next_TXOneCount <= 4'h0; + next_TXLineState <= JBit; + next_USBWireReq <= 1'b1; + end + else if (processTxByteWEn == 1'b1) + begin + NextState_prcTxB <= `SEND_BYTE_UPDATE_BYTE; + next_processTxByteRdy <= 1'b0; + next_TxByte <= TxByteIn; + next_TxByteCtrl <= TxByteCtrlIn; + next_TxByteFullSpeedRate <= TxByteFullSpeedRateIn; + next_USBWireFullSpeedRate <= TxByteFullSpeedRateIn; + next_i <= 4'h0; + end + end + `PTBY_WAIT_GNT: + if (USBWireGnt == 1'b1) + NextState_prcTxB <= `WAIT_RDY_WIRE; + `WAIT_RDY_WIRE: + if ((USBWireRdy == 1'b1) && (TxByteFullSpeedRate == 1'b0)) + NextState_prcTxB <= `LS_START_SND_IDLE1; + else if (USBWireRdy == 1'b1) + begin + NextState_prcTxB <= `WAIT_RDY_PKT; + //actively drive the first J bit + next_USBWireData <= JBit; + next_USBWireCtrl <= `DRIVE; + next_USBWireWEn <= 1'b1; + end + `WAIT_RDY_PKT: + begin + next_USBWireWEn <= 1'b0; + NextState_prcTxB <= `SEND_BYTE_UPDATE_BYTE; + next_i <= 4'h0; + end + `SEND_BYTE_UPDATE_BYTE: + begin + next_i <= i + 1'b1; + next_TxByte <= {1'b0, TxByte[7:1] }; + if (TxByte[0] == 1'b1) //If this bit is 1, then + next_TXOneCount <= TXOneCount + 1'b1; + //increment 'TXOneCount' + else //else this is a zero bit + begin + next_TXOneCount <= 4'h0; + //reset 'TXOneCount' + if (TXLineState == JBit) + next_TXLineState <= KBit; + //toggle the line state + else + next_TXLineState <= JBit; + end + NextState_prcTxB <= `SEND_BYTE_WAIT_RDY; + end + `SEND_BYTE_WAIT_RDY: + if (USBWireRdy == 1'b1) + begin + NextState_prcTxB <= `SEND_BYTE_CHK; + next_USBWireWEn <= 1'b1; + next_USBWireData <= TXLineState; + next_USBWireCtrl <= `DRIVE; + end + `SEND_BYTE_CHK: + begin + next_USBWireWEn <= 1'b0; + if (TXOneCount == `MAX_CONSEC_SAME_BITS) + NextState_prcTxB <= `SEND_BYTE_BIT_STUFF; + else if (i != 4'h8) + NextState_prcTxB <= `SEND_BYTE_UPDATE_BYTE; + else + NextState_prcTxB <= `STOP_CHK; + end + `SEND_BYTE_BIT_STUFF: + begin + next_TXOneCount <= 4'h0; + //reset 'TXOneCount' + if (TXLineState == JBit) + next_TXLineState <= KBit; + //toggle the line state + else + next_TXLineState <= JBit; + NextState_prcTxB <= `SEND_BYTE_WAIT_RDY2; + end + `SEND_BYTE_WAIT_RDY2: + if (USBWireRdy == 1'b1) + begin + NextState_prcTxB <= `SEND_BYTE_CHK_FIN; + next_USBWireWEn <= 1'b1; + next_USBWireData <= TXLineState; + next_USBWireCtrl <= `DRIVE; + end + `SEND_BYTE_CHK_FIN: + begin + next_USBWireWEn <= 1'b0; + if (i == 4'h8) + NextState_prcTxB <= `STOP_CHK; + else + NextState_prcTxB <= `SEND_BYTE_UPDATE_BYTE; + end + `STOP_SND_SE0_2: + begin + next_USBWireWEn <= 1'b0; + NextState_prcTxB <= `STOP_W_RDY2; + end + `STOP_SND_SE0_1: + NextState_prcTxB <= `STOP_W_RDY1; + `STOP_CHK: + if (TxByteCtrl == `DATA_STOP) + NextState_prcTxB <= `STOP_SND_SE0_1; + else + NextState_prcTxB <= `PTBY_WAIT_EN; + `STOP_SND_J: + begin + next_USBWireWEn <= 1'b0; + NextState_prcTxB <= `STOP_W_RDY3; + end + `STOP_SND_IDLE: + begin + next_USBWireWEn <= 1'b0; + NextState_prcTxB <= `STOP_W_RDY4; + end + `STOP_FIN: + begin + next_USBWireWEn <= 1'b0; + next_USBWireReq <= 1'b0; + //release the wire + NextState_prcTxB <= `PTBY_WAIT_EN; + end + `STOP_W_RDY1: + if (USBWireRdy == 1'b1) + begin + NextState_prcTxB <= `STOP_SND_SE0_2; + next_USBWireWEn <= 1'b1; + next_USBWireData <= `SE0; + next_USBWireCtrl <= `DRIVE; + end + `STOP_W_RDY2: + if (USBWireRdy == 1'b1) + begin + NextState_prcTxB <= `STOP_SND_J; + next_USBWireWEn <= 1'b1; + next_USBWireData <= `SE0; + next_USBWireCtrl <= `DRIVE; + end + `STOP_W_RDY3: + if (USBWireRdy == 1'b1) + begin + NextState_prcTxB <= `STOP_SND_IDLE; + next_USBWireWEn <= 1'b1; + next_USBWireData <= JBit; + next_USBWireCtrl <= `DRIVE; + end + `STOP_W_RDY4: + if (USBWireRdy == 1'b1) + begin + NextState_prcTxB <= `STOP_FIN; + next_USBWireWEn <= 1'b1; + next_USBWireData <= JBit; + next_USBWireCtrl <= `TRI_STATE; + end + `LS_START_SND_IDLE3: + begin + next_USBWireWEn <= 1'b0; + NextState_prcTxB <= `LS_START_W_RDY2; + end + `LS_START_SND_J1: + begin + next_USBWireWEn <= 1'b0; + NextState_prcTxB <= `LS_START_W_RDY3; + end + `LS_START_SND_IDLE1: + if (USBWireRdy == 1'b1) + begin + NextState_prcTxB <= `LS_START_SND_IDLE2; + next_USBWireWEn <= 1'b1; + next_USBWireData <= JBit; + next_USBWireCtrl <= `TRI_STATE; + end + `LS_START_SND_IDLE2: + begin + next_USBWireWEn <= 1'b0; + NextState_prcTxB <= `LS_START_W_RDY1; + end + `LS_START_FIN: + begin + next_USBWireWEn <= 1'b0; + NextState_prcTxB <= `SEND_BYTE_UPDATE_BYTE; + next_i <= 4'h0; + end + `LS_START_W_RDY1: + if (USBWireRdy == 1'b1) + begin + NextState_prcTxB <= `LS_START_SND_IDLE3; + next_USBWireWEn <= 1'b1; + next_USBWireData <= JBit; + next_USBWireCtrl <= `TRI_STATE; + end + `LS_START_W_RDY2: + if (USBWireRdy == 1'b1) + begin + NextState_prcTxB <= `LS_START_SND_J1; + next_USBWireWEn <= 1'b1; + next_USBWireData <= JBit; + next_USBWireCtrl <= `TRI_STATE; + end + `LS_START_W_RDY3: + if (USBWireRdy == 1'b1) + begin + NextState_prcTxB <= `LS_START_FIN; + //Drive the first JBit + next_USBWireWEn <= 1'b1; + next_USBWireData <= JBit; + next_USBWireCtrl <= `DRIVE; + end + endcase +end + +//---------------------------------- +// Current State Logic (sequential) +//---------------------------------- +always @ (posedge clk) +begin : prcTxB_CurrentState + if (rst) + CurrState_prcTxB <= `START_PTBY; + else + CurrState_prcTxB <= NextState_prcTxB; +end + +//---------------------------------- +// Registered outputs logic +//---------------------------------- +always @ (posedge clk) +begin : prcTxB_RegOutput + if (rst) + begin + i <= 4'h0; + TxByte <= 8'h00; + TxByteCtrl <= 8'h00; + TXLineState <= 2'b0; + TXOneCount <= 4'h0; + TxByteFullSpeedRate <= 1'b0; + processTxByteRdy <= 1'b0; + USBWireData <= 2'b00; + USBWireCtrl <= `TRI_STATE; + USBWireReq <= 1'b0; + USBWireWEn <= 1'b0; + USBWireFullSpeedRate <= 1'b0; + end + else + begin + i <= next_i; + TxByte <= next_TxByte; + TxByteCtrl <= next_TxByteCtrl; + TXLineState <= next_TXLineState; + TXOneCount <= next_TXOneCount; + TxByteFullSpeedRate <= next_TxByteFullSpeedRate; + processTxByteRdy <= next_processTxByteRdy; + USBWireData <= next_USBWireData; + USBWireCtrl <= next_USBWireCtrl; + USBWireReq <= next_USBWireReq; + USBWireWEn <= next_USBWireWEn; + USBWireFullSpeedRate <= next_USBWireFullSpeedRate; + end +end + +endmodule \ No newline at end of file Index: Actel/usbDeviceActelTop/hdl/Copy of EP1Mouse.v =================================================================== --- Actel/usbDeviceActelTop/hdl/Copy of EP1Mouse.v (nonexistent) +++ Actel/usbDeviceActelTop/hdl/Copy of EP1Mouse.v (revision 40) @@ -0,0 +1,290 @@ + +////////////////////////////////////////////////////////////////////// +//// //// +//// EP1Mouse.v //// +//// //// +//// This file is part of the spiMaster opencores effort. +//// //// +//// //// +//// Module Description: //// +//// parameterized dual clock domain fifo. +//// fifo depth is restricted to 2^ADDR_WIDTH +//// No protection against over runs and under runs. +//// +//// //// +//// To Do: //// +//// +//// //// +//// Author(s): //// +//// - Steve Fielding, sfielding@base2designs.com //// +//// //// +////////////////////////////////////////////////////////////////////// +//// //// +//// Copyright (C) 2008 Steve Fielding and OPENCORES.ORG //// +//// //// +//// This source file may be used and distributed without //// +//// restriction provided that this copyright statement is not //// +//// removed from the file and that any derivative work contains //// +//// the original copyright notice and the associated disclaimer. //// +//// //// +//// This source file is free software; you can redistribute it //// +//// and/or modify it under the terms of the GNU Lesser General //// +//// Public License as published by the Free Software Foundation; //// +//// either version 2.1 of the License, or (at your option) any //// +//// later version. //// +//// //// +//// This source is distributed in the hope that it will be //// +//// useful, but WITHOUT ANY WARRANTY; without even the implied //// +//// warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR //// +//// PURPOSE. See the GNU Lesser General Public License for more //// +//// details. //// +//// //// +//// You should have received a copy of the GNU Lesser General //// +//// Public License along with this source; if not, download it //// +//// from //// +//// //// +////////////////////////////////////////////////////////////////////// +// +`include "timescale.v" +`include "usbHostSlaveReg_define.v" + +module EP1Mouse (clk, initComplete, rst, wb_ack, wb_addr, wb_data_i, wb_data_o, wb_stb, wb_we, wbBusGnt, wbBusReq); +input clk; +input initComplete; +input rst; +input wb_ack; +input [7:0]wb_data_i; +input wbBusGnt; +output [7:0]wb_addr; +output [7:0]wb_data_o; +output wb_stb; +output wb_we; +output wbBusReq; + +wire clk; +wire initComplete; +wire rst; +wire wb_ack; +reg [7:0]wb_addr, next_wb_addr; +wire [7:0]wb_data_i; +reg [7:0]wb_data_o, next_wb_data_o; +reg wb_stb, next_wb_stb; +reg wb_we, next_wb_we; +wire wbBusGnt; +reg wbBusReq, next_wbBusReq; + +// diagram signals declarations +reg [7:0]cnt, next_cnt; +reg dataSeq, next_dataSeq; +reg localRst, next_localRst; +reg transDone, next_transDone; + +// BINARY ENCODED state machine: EP1St +// State codes definitions: +`define DO_TRANS_WT_GNT 4'b0000 +`define DO_TRANS_TX_EMPTY 4'b0001 +`define DO_TRANS_WR_TX_FIFO1 4'b0010 +`define DO_TRANS_TRANS_GO 4'b0011 +`define DO_TRANS_WT_TRANS_DONE_WT_GNT 4'b0100 +`define DO_TRANS_WT_TRANS_DONE_GET_RDY_STS 4'b0101 +`define DO_TRANS_WT_TRANS_DONE_WT_UNGNT 4'b0110 +`define DO_TRANS_WT_TRANS_DONE_CHK_DONE 4'b0111 +`define START 4'b1000 +`define DO_TRANS_WR_TX_FIFO2 4'b1001 +`define DO_TRANS_WR_TX_FIFO3 4'b1010 +`define DO_TRANS_WT_TRANS_DONE_DEL 4'b1011 + +reg [3:0]CurrState_EP1St, NextState_EP1St; + +// Diagram actions (continuous assignments allowed only: assign ...) +// diagram ACTION + + +// Machine: EP1St + +// NextState logic (combinatorial) +always @ (wbBusGnt or wb_ack or wb_data_i or transDone or initComplete or cnt or wbBusReq or wb_addr or wb_data_o or wb_stb or wb_we or dataSeq or CurrState_EP1St) +begin + NextState_EP1St <= CurrState_EP1St; + // Set default values for outputs and signals + next_wbBusReq <= wbBusReq; + next_wb_addr <= wb_addr; + next_wb_data_o <= wb_data_o; + next_wb_stb <= wb_stb; + next_wb_we <= wb_we; + next_transDone <= transDone; + next_cnt <= cnt; + next_dataSeq <= dataSeq; + case (CurrState_EP1St) // synopsys parallel_case full_case + `START: + begin + next_wbBusReq <= 1'b0; + next_wb_addr <= 8'h00; + next_wb_data_o <= 8'h00; + next_wb_stb <= 1'b0; + next_wb_we <= 1'b0; + next_cnt <= 8'h00; + next_dataSeq <= 1'b0; + next_transDone <= 1'b0; + if (initComplete == 1'b1) + begin + NextState_EP1St <= `DO_TRANS_WT_GNT; + end + end + `DO_TRANS_WT_GNT: + begin + next_wbBusReq <= 1'b1; + if (wbBusGnt == 1'b1) + begin + NextState_EP1St <= `DO_TRANS_TX_EMPTY; + end + end + `DO_TRANS_TX_EMPTY: + begin + next_wb_addr <= `RA_EP1_TX_FIFO_CONTROL_REG; + next_wb_data_o <= 8'h01; + //force tx fifo empty + next_wb_stb <= 1'b1; + next_wb_we <= 1'b1; + if (wb_ack == 1'b1) + begin + NextState_EP1St <= `DO_TRANS_WR_TX_FIFO1; + next_wb_stb <= 1'b0; + next_wb_addr <= `RA_EP1_TX_FIFO_DATA_REG; + next_wb_we <= 1'b1; + end + end + `DO_TRANS_WR_TX_FIFO1: + begin + next_wb_data_o <= 8'h00; + next_wb_stb <= 1'b1; + if (wb_ack == 1'b1) + begin + NextState_EP1St <= `DO_TRANS_WR_TX_FIFO2; + next_wb_stb <= 1'b0; + end + end + `DO_TRANS_TRANS_GO: + begin + next_wb_addr <= `RA_EP1_CONTROL_REG; + if (dataSeq == 1'b1) + next_wb_data_o <= 8'h07; + else + next_wb_data_o <= 8'h03; + next_wb_stb <= 1'b1; + next_wb_we <= 1'b1; + if (wb_ack == 1'b1) + begin + NextState_EP1St <= `DO_TRANS_WT_TRANS_DONE_WT_GNT; + next_wb_stb <= 1'b0; + next_transDone <= 1'b0; + end + end + `DO_TRANS_WR_TX_FIFO2: + begin + next_wb_data_o <= 8'h01; + next_wb_stb <= 1'b1; + if (wb_ack == 1'b1) + begin + NextState_EP1St <= `DO_TRANS_WR_TX_FIFO3; + next_wb_stb <= 1'b0; + end + end + `DO_TRANS_WR_TX_FIFO3: + begin + next_wb_data_o <= 8'h01; + next_wb_stb <= 1'b1; + if (wb_ack == 1'b1) + begin + NextState_EP1St <= `DO_TRANS_TRANS_GO; + next_wb_stb <= 1'b0; + end + end + `DO_TRANS_WT_TRANS_DONE_WT_GNT: + begin + next_wbBusReq <= 1'b1; + if (wbBusGnt == 1'b1) + begin + NextState_EP1St <= `DO_TRANS_WT_TRANS_DONE_GET_RDY_STS; + end + end + `DO_TRANS_WT_TRANS_DONE_GET_RDY_STS: + begin + next_wb_addr <= `RA_EP1_CONTROL_REG; + next_wb_stb <= 1'b1; + next_wb_we <= 1'b0; + if (wb_ack == 1'b1) + begin + NextState_EP1St <= `DO_TRANS_WT_TRANS_DONE_WT_UNGNT; + next_wb_stb <= 1'b0; + next_transDone <= ~wb_data_i[`ENDPOINT_READY_BIT]; + end + end + `DO_TRANS_WT_TRANS_DONE_WT_UNGNT: + begin + next_wbBusReq <= 1'b0; + if (wbBusGnt == 1'b0) + begin + NextState_EP1St <= `DO_TRANS_WT_TRANS_DONE_CHK_DONE; + end + end + `DO_TRANS_WT_TRANS_DONE_CHK_DONE: + begin + if (transDone == 1'b1) + begin + NextState_EP1St <= `DO_TRANS_WT_GNT; + end + else + begin + NextState_EP1St <= `DO_TRANS_WT_TRANS_DONE_DEL; + next_cnt <= 8'h00; + end + end + `DO_TRANS_WT_TRANS_DONE_DEL: + begin + next_cnt <= cnt + 1'b1; + if (cnt == `ONE_USEC_DEL) + begin + NextState_EP1St <= `DO_TRANS_WT_TRANS_DONE_WT_GNT; + end + end + endcase +end + +// Current State Logic (sequential) +always @ (posedge clk) +begin + if (rst == 1'b1) + CurrState_EP1St <= `START; + else + CurrState_EP1St <= NextState_EP1St; +end + +// Registered outputs logic +always @ (posedge clk) +begin + if (rst == 1'b1) + begin + wbBusReq <= 1'b0; + wb_addr <= 8'h00; + wb_data_o <= 8'h00; + wb_stb <= 1'b0; + wb_we <= 1'b0; + transDone <= 1'b0; + cnt <= 8'h00; + dataSeq <= 1'b0; + end + else + begin + wbBusReq <= next_wbBusReq; + wb_addr <= next_wb_addr; + wb_data_o <= next_wb_data_o; + wb_stb <= next_wb_stb; + wb_we <= next_wb_we; + transDone <= next_transDone; + cnt <= next_cnt; + dataSeq <= next_dataSeq; + end +end + +endmodule \ No newline at end of file Index: Actel/usbDeviceActelTop/hdl/updateCRC16.v =================================================================== --- Actel/usbDeviceActelTop/hdl/updateCRC16.v (nonexistent) +++ Actel/usbDeviceActelTop/hdl/updateCRC16.v (revision 40) @@ -0,0 +1,105 @@ +////////////////////////////////////////////////////////////////////// +//// //// +//// updateCRC16.v //// +//// //// +//// This file is part of the usbhostslave opencores effort. +//// //// +//// //// +//// Module Description: //// +//// +//// //// +//// To Do: //// +//// +//// //// +//// Author(s): //// +//// - Steve Fielding, sfielding@base2designs.com //// +//// //// +////////////////////////////////////////////////////////////////////// +//// //// +//// Copyright (C) 2004 Steve Fielding and OPENCORES.ORG //// +//// //// +//// This source file may be used and distributed without //// +//// restriction provided that this copyright statement is not //// +//// removed from the file and that any derivative work contains //// +//// the original copyright notice and the associated disclaimer. //// +//// //// +//// This source file is free software; you can redistribute it //// +//// and/or modify it under the terms of the GNU Lesser General //// +//// Public License as published by the Free Software Foundation; //// +//// either version 2.1 of the License, or (at your option) any //// +//// later version. //// +//// //// +//// This source is distributed in the hope that it will be //// +//// useful, but WITHOUT ANY WARRANTY; without even the implied //// +//// warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR //// +//// PURPOSE. See the GNU Lesser General Public License for more //// +//// details. //// +//// //// +//// You should have received a copy of the GNU Lesser General //// +//// Public License along with this source; if not, download it //// +//// from //// +//// //// +////////////////////////////////////////////////////////////////////// +// +`include "timescale.v" + +module updateCRC16 (rstCRC, CRCResult, CRCEn, dataIn, ready, clk, rst); +input rstCRC; +input CRCEn; +input [7:0] dataIn; +input clk; +input rst; +output [15:0] CRCResult; +output ready; + +wire rstCRC; +wire CRCEn; +wire [7:0] dataIn; +wire clk; +wire rst; +reg [15:0] CRCResult; +reg ready; + +reg doUpdateCRC; +reg [7:0] data; +reg [3:0] i; + +always @(posedge clk) +begin + if (rst == 1'b1 || rstCRC == 1'b1) begin + doUpdateCRC <= 1'b0; + i <= 4'h0; + CRCResult <= 16'hffff; + ready <= 1'b1; + end + else + begin + if (doUpdateCRC == 1'b0) + begin + if (CRCEn == 1'b1) begin + doUpdateCRC <= 1'b1; + data <= dataIn; + ready <= 1'b0; + end + end + else begin + i <= i + 1'b1; + if ( (CRCResult[0] ^ data[0]) == 1'b1) begin + CRCResult <= {1'b0, CRCResult[15:1]} ^ 16'ha001; + end + else begin + CRCResult <= {1'b0, CRCResult[15:1]}; + end + data <= {1'b0, data[7:1]}; + if (i == 4'h7) + begin + doUpdateCRC <= 1'b0; + i <= 4'h0; + ready <= 1'b1; + end + end + end +end + + +endmodule Index: Actel/usbDeviceActelTop/hdl/usbDevice_define.v =================================================================== --- Actel/usbDeviceActelTop/hdl/usbDevice_define.v (nonexistent) +++ Actel/usbDeviceActelTop/hdl/usbDevice_define.v (revision 40) @@ -0,0 +1,48 @@ +// ----------------------------- usbDevice_define --------------------------- + +`define ZERO_ZERO_STAT_INDEX 8'h6c +`define ONE_ZERO_STAT_INDEX 8'h6e +`define VENDOR_DATA_STAT_INDEX 8'h70 +`define DEV_DESC_INDEX 8'h00 +`define DEV_DESC_SIZE 8'h12 +//config descriptor is bundled with interface desc, HID desc, and EP1 desc +`define CFG_DESC_INDEX 8'h12 +`define CFG_DESC_SIZE 8'h22 +`define REP_DESC_INDEX 8'h3a +`define REP_DESC_SIZE 8'h32 +`define LANGID_DESC_INDEX 8'h80 +`define LANGID_DESC_SIZE 8'h04 +`define STRING1_DESC_INDEX 8'h90 +`define STRING1_DESC_SIZE 8'd26 +`define STRING2_DESC_INDEX 8'hb0 +`define STRING2_DESC_SIZE 8'd20 +`define STRING3_DESC_INDEX 8'hd0 +`define STRING3_DESC_SIZE 8'd30 + +`define DEV_DESC 8'h01 +`define CFG_DESC 8'h02 +`define REP_DESC 8'h22 +`define STRING_DESC 8'h03 + +//delays at 48MHz +`ifdef SIM_COMPILE +`define ONE_MSEC_DEL 16'h0300 +`else +`define ONE_MSEC_DEL 16'hbb80 +`endif +`define ONE_USEC_DEL 8'h30 + +`define GET_STATUS 8'h00 +`define CLEAR_FEATURE 8'h01 +`define SET_FEATURE 8'h03 +`define SET_ADDRESS 8'h05 +`define GET_DESCRIPTOR 8'h06 +`define SET_DESCRIPTOR 8'h07 +`define GET_CONFIG 8'h08 +`define SET_CONFIG 8'h09 +`define GET_INTERFACE 8'h0a +`define SET_INTERFACE 8'h0b +`define SYNCH_FRAME 8'h0c + +`define MAX_RESP_SIZE 8'h40 + Index: Actel/usbDeviceActelTop/hdl/usbSlave.v =================================================================== --- Actel/usbDeviceActelTop/hdl/usbSlave.v (nonexistent) +++ Actel/usbDeviceActelTop/hdl/usbSlave.v (revision 40) @@ -0,0 +1,474 @@ +////////////////////////////////////////////////////////////////////// +//// //// +//// usbSlave.v //// +//// //// +//// This file is part of the usbhostslave opencores effort. +//// //// +//// //// +//// Module Description: //// +//// Top level module +//// //// +//// To Do: //// +//// +//// //// +//// Author(s): //// +//// - Steve Fielding, sfielding@base2designs.com //// +//// //// +////////////////////////////////////////////////////////////////////// +//// //// +//// Copyright (C) 2008 Steve Fielding and OPENCORES.ORG //// +//// //// +//// This source file may be used and distributed without //// +//// restriction provided that this copyright statement is not //// +//// removed from the file and that any derivative work contains //// +//// the original copyright notice and the associated disclaimer. //// +//// //// +//// This source file is free software; you can redistribute it //// +//// and/or modify it under the terms of the GNU Lesser General //// +//// Public License as published by the Free Software Foundation; //// +//// either version 2.1 of the License, or (at your option) any //// +//// later version. //// +//// //// +//// This source is distributed in the hope that it will be //// +//// useful, but WITHOUT ANY WARRANTY; without even the implied //// +//// warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR //// +//// PURPOSE. See the GNU Lesser General Public License for more //// +//// details. //// +//// //// +//// You should have received a copy of the GNU Lesser General //// +//// Public License along with this source; if not, download it //// +//// from //// +//// //// +////////////////////////////////////////////////////////////////////// +// +`include "timescale.v" + +module usbSlave( + clk_i, + rst_i, + address_i, + data_i, + data_o, + we_i, + strobe_i, + ack_o, + usbClk, + slaveVBusDetIntOut, + slaveNAKSentIntOut, + slaveSOFRxedIntOut, + slaveResetEventIntOut, + slaveResumeIntOut, + slaveTransDoneIntOut, + USBWireDataIn, + USBWireDataInTick, + USBWireDataOut, + USBWireDataOutTick, + USBWireCtrlOut, + USBFullSpeed, + USBDPlusPullup, + USBDMinusPullup, + vBusDetect + ); + parameter EP0_FIFO_DEPTH = 64; + parameter EP0_FIFO_ADDR_WIDTH = 6; + parameter EP1_FIFO_DEPTH = 64; + parameter EP1_FIFO_ADDR_WIDTH = 6; + parameter EP2_FIFO_DEPTH = 64; + parameter EP2_FIFO_ADDR_WIDTH = 6; + parameter EP3_FIFO_DEPTH = 64; + parameter EP3_FIFO_ADDR_WIDTH = 6; + +input clk_i; //Wishbone bus clock. Maximum 5*usbClk=240MHz +input rst_i; //Wishbone bus sync reset. Synchronous to 'clk_i'. Resets all logic +input [7:0] address_i; //Wishbone bus address in +input [7:0] data_i; //Wishbone bus data in +output [7:0] data_o; //Wishbone bus data out +input we_i; //Wishbone bus write enable in +input strobe_i; //Wishbone bus strobe in +output ack_o; //Wishbone bus acknowledge out +input usbClk; //usb clock. 48Mhz +/-0.25% +output slaveSOFRxedIntOut; +output slaveResetEventIntOut; +output slaveResumeIntOut; +output slaveTransDoneIntOut; +output slaveNAKSentIntOut; +output slaveVBusDetIntOut; +input [1:0] USBWireDataIn; +output [1:0] USBWireDataOut; +output USBWireDataOutTick; +output USBWireDataInTick; +output USBWireCtrlOut; +output USBFullSpeed; +output USBDPlusPullup; +output USBDMinusPullup; +input vBusDetect; + +wire clk_i; +wire rst_i; +wire [7:0] address_i; +wire [7:0] data_i; +wire [7:0] data_o; +wire we_i; +wire strobe_i; +wire ack_o; +wire usbClk; +wire slaveSOFRxedIntOut; +wire slaveResetEventIntOut; +wire slaveResumeIntOut; +wire slaveTransDoneIntOut; +wire slaveNAKSentIntOut; +wire slaveVBusDetIntOut; +wire [1:0] USBWireDataIn; +wire [1:0] USBWireDataOut; +wire USBWireDataOutTick; +wire USBWireDataInTick; +wire USBWireCtrlOut; +wire USBFullSpeed; +wire USBDPlusPullup; +wire USBDMinusPullup; +wire vBusDetect; + +//internal wiring +wire slaveControlSel; +wire hostSlaveMuxSel; +wire [7:0] dataFromSlaveControl; +wire [7:0] dataFromHostSlaveMux; +wire [7:0] RxCtrlOut; +wire [7:0] RxDataFromSIE; +wire RxDataOutWEn; +wire fullSpeedBitRateFromSlave; +wire fullSpeedPolarityFromSlave; +wire SIEPortWEnFromSlave; +wire SIEPortTxRdy; +wire [7:0] SIEPortDataInFromSlave; +wire [7:0] SIEPortCtrlInFromSlave; +wire [1:0] connectState; +wire resumeDetected; +wire [7:0] SIEPortDataInToSIE; +wire SIEPortWEnToSIE; +wire [7:0] SIEPortCtrlInToSIE; +wire fullSpeedPolarityToSIE; +wire fullSpeedBitRateToSIE; +wire connectSlaveToHost; +wire noActivityTimeOut; +wire TxFifoEP0REn; +wire TxFifoEP1REn; +wire TxFifoEP2REn; +wire TxFifoEP3REn; +wire [7:0] TxFifoEP0Data; +wire [7:0] TxFifoEP1Data; +wire [7:0] TxFifoEP2Data; +wire [7:0] TxFifoEP3Data; +wire TxFifoEP0Empty; +wire TxFifoEP1Empty; +wire TxFifoEP2Empty; +wire TxFifoEP3Empty; +wire RxFifoEP0WEn; +wire RxFifoEP1WEn; +wire RxFifoEP2WEn; +wire RxFifoEP3WEn; +wire RxFifoEP0Full; +wire RxFifoEP1Full; +wire RxFifoEP2Full; +wire RxFifoEP3Full; +wire [7:0] slaveRxFifoData; +wire [7:0] dataFromEP0RxFifo; +wire [7:0] dataFromEP1RxFifo; +wire [7:0] dataFromEP2RxFifo; +wire [7:0] dataFromEP3RxFifo; +wire [7:0] dataFromEP0TxFifo; +wire [7:0] dataFromEP1TxFifo; +wire [7:0] dataFromEP2TxFifo; +wire [7:0] dataFromEP3TxFifo; +wire slaveEP0RxFifoSel; +wire slaveEP1RxFifoSel; +wire slaveEP2RxFifoSel; +wire slaveEP3RxFifoSel; +wire slaveEP0TxFifoSel; +wire slaveEP1TxFifoSel; +wire slaveEP2TxFifoSel; +wire slaveEP3TxFifoSel; +wire rstSyncToBusClk; +wire rstSyncToUsbClk; +wire noActivityTimeOutEnableToSIE; +wire noActivityTimeOutEnableFromHost; +wire noActivityTimeOutEnableFromSlave; + +assign USBFullSpeed = fullSpeedBitRateToSIE; +assign USBDPlusPullup = (USBFullSpeed & connectSlaveToHost); +assign USBDMinusPullup = (~USBFullSpeed & connectSlaveToHost); + +usbSlaveControl u_usbSlaveControl( + .busClk(clk_i), + .rstSyncToBusClk(rstSyncToBusClk), + .usbClk(usbClk), + .rstSyncToUsbClk(rstSyncToUsbClk), + .RxByteStatus(RxCtrlOut), + .RxData(RxDataFromSIE), + .RxDataValid(RxDataOutWEn), + .SIERxTimeOut(noActivityTimeOut), + .SIERxTimeOutEn(noActivityTimeOutEnableFromSlave), + .RxFifoData(slaveRxFifoData), + .connectSlaveToHost(connectSlaveToHost), + .fullSpeedRate(fullSpeedBitRateFromSlave), + .fullSpeedPol(fullSpeedPolarityFromSlave), + .SCTxPortEn(SIEPortWEnFromSlave), + .SCTxPortRdy(SIEPortTxRdy), + .SCTxPortData(SIEPortDataInFromSlave), + .SCTxPortCtrl(SIEPortCtrlInFromSlave), + .vBusDetect(vBusDetect), + .connectStateIn(connectState), + .resumeDetectedIn(resumeDetected), + .busAddress(address_i[4:0]), + .busDataIn(data_i), + .busDataOut(dataFromSlaveControl), + .busWriteEn(we_i), + .busStrobe_i(strobe_i), + .SOFRxedIntOut(slaveSOFRxedIntOut), + .resetEventIntOut(slaveResetEventIntOut), + .resumeIntOut(slaveResumeIntOut), + .transDoneIntOut(slaveTransDoneIntOut), + .NAKSentIntOut(slaveNAKSentIntOut), + .vBusDetIntOut(slaveVBusDetIntOut), + .slaveControlSelect(slaveControlSel), + .TxFifoEP0REn(TxFifoEP0REn), + .TxFifoEP1REn(TxFifoEP1REn), + .TxFifoEP2REn(TxFifoEP2REn), + .TxFifoEP3REn(TxFifoEP3REn), + .TxFifoEP0Data(TxFifoEP0Data), + .TxFifoEP1Data(TxFifoEP1Data), + .TxFifoEP2Data(TxFifoEP2Data), + .TxFifoEP3Data(TxFifoEP3Data), + .TxFifoEP0Empty(TxFifoEP0Empty), + .TxFifoEP1Empty(TxFifoEP1Empty), + .TxFifoEP2Empty(TxFifoEP2Empty), + .TxFifoEP3Empty(TxFifoEP3Empty), + .RxFifoEP0WEn(RxFifoEP0WEn), + .RxFifoEP1WEn(RxFifoEP1WEn), + .RxFifoEP2WEn(RxFifoEP2WEn), + .RxFifoEP3WEn(RxFifoEP3WEn), + .RxFifoEP0Full(RxFifoEP0Full), + .RxFifoEP1Full(RxFifoEP1Full), + .RxFifoEP2Full(RxFifoEP2Full), + .RxFifoEP3Full(RxFifoEP3Full) + ); + + +wishBoneBI u_wishBoneBI ( + .address(address_i), + .dataIn(data_i), + .dataOut(data_o), + .writeEn(we_i), + .strobe_i(strobe_i), + .ack_o(ack_o), + .clk(clk_i), + .rst(rstSyncToBusClk), + .hostControlSel(), + .hostRxFifoSel(), + .hostTxFifoSel(), + .slaveControlSel(slaveControlSel), + .slaveEP0RxFifoSel(slaveEP0RxFifoSel), + .slaveEP1RxFifoSel(slaveEP1RxFifoSel), + .slaveEP2RxFifoSel(slaveEP2RxFifoSel), + .slaveEP3RxFifoSel(slaveEP3RxFifoSel), + .slaveEP0TxFifoSel(slaveEP0TxFifoSel), + .slaveEP1TxFifoSel(slaveEP1TxFifoSel), + .slaveEP2TxFifoSel(slaveEP2TxFifoSel), + .slaveEP3TxFifoSel(slaveEP3TxFifoSel), + .hostSlaveMuxSel(hostSlaveMuxSel), + .dataFromHostControl(8'h00), + .dataFromHostRxFifo(8'h00), + .dataFromHostTxFifo(8'h00), + .dataFromSlaveControl(dataFromSlaveControl), + .dataFromEP0RxFifo(dataFromEP0RxFifo), + .dataFromEP1RxFifo(dataFromEP1RxFifo), + .dataFromEP2RxFifo(dataFromEP2RxFifo), + .dataFromEP3RxFifo(dataFromEP3RxFifo), + .dataFromEP0TxFifo(dataFromEP0TxFifo), + .dataFromEP1TxFifo(dataFromEP1TxFifo), + .dataFromEP2TxFifo(dataFromEP2TxFifo), + .dataFromEP3TxFifo(dataFromEP3TxFifo), + .dataFromHostSlaveMux(dataFromHostSlaveMux) + ); + + + +assign SIEPortCtrlInToSIE = SIEPortCtrlInFromSlave; +assign SIEPortDataInToSIE = SIEPortDataInFromSlave; +assign SIEPortWEnToSIE = SIEPortWEnFromSlave; +assign fullSpeedPolarityToSIE = fullSpeedPolarityFromSlave; +assign fullSpeedBitRateToSIE = fullSpeedBitRateFromSlave; +assign noActivityTimeOutEnableToSIE = noActivityTimeOutEnableFromSlave; + +hostSlaveMuxBI u_hostSlaveMuxBI ( + .dataIn(data_i), + .dataOut(dataFromHostSlaveMux), + .address(address_i[0]), + .writeEn(we_i), + .strobe_i(strobe_i), + .usbClk(usbClk), + .busClk(clk_i), + .hostSlaveMuxSel(hostSlaveMuxSel), + .hostMode(), + .rstFromWire(rst_i), + .rstSyncToBusClkOut(rstSyncToBusClk), + .rstSyncToUsbClkOut(rstSyncToUsbClk) +); + +usbSerialInterfaceEngine u_usbSerialInterfaceEngine( + .clk(usbClk), + .rst(rstSyncToUsbClk), + .USBWireDataIn(USBWireDataIn), + .USBWireDataOut(USBWireDataOut), + .USBWireDataInTick(USBWireDataInTick), + .USBWireDataOutTick(USBWireDataOutTick), + .USBWireCtrlOut(USBWireCtrlOut), + .connectState(connectState), + .resumeDetected(resumeDetected), + .RxCtrlOut(RxCtrlOut), + .RxDataOutWEn(RxDataOutWEn), + .RxDataOut(RxDataFromSIE), + .SIEPortCtrlIn(SIEPortCtrlInToSIE), + .SIEPortDataIn(SIEPortDataInToSIE), + .SIEPortTxRdy(SIEPortTxRdy), + .SIEPortWEn(SIEPortWEnToSIE), + .fullSpeedPolarity(fullSpeedPolarityToSIE), + .fullSpeedBitRate(fullSpeedBitRateToSIE), + .noActivityTimeOut(noActivityTimeOut), + .noActivityTimeOutEnable(noActivityTimeOutEnableToSIE) +); + + + +//---Slave fifos + +TxFifo #(EP0_FIFO_DEPTH, EP0_FIFO_ADDR_WIDTH) EP0TxFifo ( + .usbClk(usbClk), + .busClk(clk_i), + .rstSyncToBusClk(rstSyncToBusClk), + .rstSyncToUsbClk(rstSyncToUsbClk), + .fifoREn(TxFifoEP0REn), + .fifoEmpty(TxFifoEP0Empty), + .busAddress(address_i[2:0]), + .busWriteEn(we_i), + .busStrobe_i(strobe_i), + .busFifoSelect(slaveEP0TxFifoSel), + .busDataIn(data_i), + .busDataOut(dataFromEP0TxFifo), + .fifoDataOut(TxFifoEP0Data) ); + +TxFifo #(EP1_FIFO_DEPTH, EP1_FIFO_ADDR_WIDTH) EP1TxFifo ( + .usbClk(usbClk), + .busClk(clk_i), + .rstSyncToBusClk(rstSyncToBusClk), + .rstSyncToUsbClk(rstSyncToUsbClk), + .fifoREn(TxFifoEP1REn), + .fifoEmpty(TxFifoEP1Empty), + .busAddress(address_i[2:0]), + .busWriteEn(we_i), + .busStrobe_i(strobe_i), + .busFifoSelect(slaveEP1TxFifoSel), + .busDataIn(data_i), + .busDataOut(dataFromEP1TxFifo), + .fifoDataOut(TxFifoEP1Data) ); + +TxFifo #(EP2_FIFO_DEPTH, EP2_FIFO_ADDR_WIDTH) EP2TxFifo ( + .usbClk(usbClk), + .busClk(clk_i), + .rstSyncToBusClk(rstSyncToBusClk), + .rstSyncToUsbClk(rstSyncToUsbClk), + .fifoREn(TxFifoEP2REn), + .fifoEmpty(TxFifoEP2Empty), + .busAddress(address_i[2:0]), + .busWriteEn(we_i), + .busStrobe_i(strobe_i), + .busFifoSelect(slaveEP2TxFifoSel), + .busDataIn(data_i), + .busDataOut(dataFromEP2TxFifo), + .fifoDataOut(TxFifoEP2Data) ); + +TxFifo #(EP3_FIFO_DEPTH, EP3_FIFO_ADDR_WIDTH) EP3TxFifo ( + .usbClk(usbClk), + .busClk(clk_i), + .rstSyncToBusClk(rstSyncToBusClk), + .rstSyncToUsbClk(rstSyncToUsbClk), + .fifoREn(TxFifoEP3REn), + .fifoEmpty(TxFifoEP3Empty), + .busAddress(address_i[2:0]), + .busWriteEn(we_i), + .busStrobe_i(strobe_i), + .busFifoSelect(slaveEP3TxFifoSel), + .busDataIn(data_i), + .busDataOut(dataFromEP3TxFifo), + .fifoDataOut(TxFifoEP3Data) ); + +RxFifo #(EP0_FIFO_DEPTH, EP0_FIFO_ADDR_WIDTH) EP0RxFifo( + .usbClk(usbClk), + .busClk(clk_i), + .rstSyncToBusClk(rstSyncToBusClk), + .rstSyncToUsbClk(rstSyncToUsbClk), + .fifoWEn(RxFifoEP0WEn), + .fifoFull(RxFifoEP0Full), + .busAddress(address_i[2:0]), + .busWriteEn(we_i), + .busStrobe_i(strobe_i), + .busFifoSelect(slaveEP0RxFifoSel), + .busDataIn(data_i), + .busDataOut(dataFromEP0RxFifo), + .fifoDataIn(slaveRxFifoData) ); + +RxFifo #(EP1_FIFO_DEPTH, EP1_FIFO_ADDR_WIDTH) EP1RxFifo( + .usbClk(usbClk), + .busClk(clk_i), + .rstSyncToBusClk(rstSyncToBusClk), + .rstSyncToUsbClk(rstSyncToUsbClk), + .fifoWEn(RxFifoEP1WEn), + .fifoFull(RxFifoEP1Full), + .busAddress(address_i[2:0]), + .busWriteEn(we_i), + .busStrobe_i(strobe_i), + .busFifoSelect(slaveEP1RxFifoSel), + .busDataIn(data_i), + .busDataOut(dataFromEP1RxFifo), + .fifoDataIn(slaveRxFifoData) ); + +RxFifo #(EP2_FIFO_DEPTH, EP2_FIFO_ADDR_WIDTH) EP2RxFifo( + .usbClk(usbClk), + .busClk(clk_i), + .rstSyncToBusClk(rstSyncToBusClk), + .rstSyncToUsbClk(rstSyncToUsbClk), + .fifoWEn(RxFifoEP2WEn), + .fifoFull(RxFifoEP2Full), + .busAddress(address_i[2:0]), + .busWriteEn(we_i), + .busStrobe_i(strobe_i), + .busFifoSelect(slaveEP2RxFifoSel), + .busDataIn(data_i), + .busDataOut(dataFromEP2RxFifo), + .fifoDataIn(slaveRxFifoData) ); + +RxFifo #(EP3_FIFO_DEPTH, EP3_FIFO_ADDR_WIDTH) EP3RxFifo( + .usbClk(usbClk), + .busClk(clk_i), + .rstSyncToBusClk(rstSyncToBusClk), + .rstSyncToUsbClk(rstSyncToUsbClk), + .fifoWEn(RxFifoEP3WEn), + .fifoFull(RxFifoEP3Full), + .busAddress(address_i[2:0]), + .busWriteEn(we_i), + .busStrobe_i(strobe_i), + .busFifoSelect(slaveEP3RxFifoSel), + .busDataIn(data_i), + .busDataOut(dataFromEP3RxFifo), + .fifoDataIn(slaveRxFifoData) ); + + + +endmodule + + + + + + + Index: Actel/usbDeviceActelTop/hdl/usbSlaveControl.v =================================================================== --- Actel/usbDeviceActelTop/hdl/usbSlaveControl.v (nonexistent) +++ Actel/usbDeviceActelTop/hdl/usbSlaveControl.v (revision 40) @@ -0,0 +1,521 @@ +////////////////////////////////////////////////////////////////////// +//// //// +//// usbSlaveControl.v //// +//// //// +//// This file is part of the usbhostslave opencores effort. +//// //// +//// //// +//// Module Description: //// +//// +//// //// +//// To Do: //// +//// +//// //// +//// Author(s): //// +//// - Steve Fielding, sfielding@base2designs.com //// +//// //// +////////////////////////////////////////////////////////////////////// +//// //// +//// Copyright (C) 2004 Steve Fielding and OPENCORES.ORG //// +//// //// +//// This source file may be used and distributed without //// +//// restriction provided that this copyright statement is not //// +//// removed from the file and that any derivative work contains //// +//// the original copyright notice and the associated disclaimer. //// +//// //// +//// This source file is free software; you can redistribute it //// +//// and/or modify it under the terms of the GNU Lesser General //// +//// Public License as published by the Free Software Foundation; //// +//// either version 2.1 of the License, or (at your option) any //// +//// later version. //// +//// //// +//// This source is distributed in the hope that it will be //// +//// useful, but WITHOUT ANY WARRANTY; without even the implied //// +//// warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR //// +//// PURPOSE. See the GNU Lesser General Public License for more //// +//// details. //// +//// //// +//// You should have received a copy of the GNU Lesser General //// +//// Public License along with this source; if not, download it //// +//// from //// +//// //// +////////////////////////////////////////////////////////////////////// +// +`include "timescale.v" + +module usbSlaveControl( + busClk, + rstSyncToBusClk, + usbClk, + rstSyncToUsbClk, + //getPacket + RxByteStatus, RxData, RxDataValid, + SIERxTimeOut, RxFifoData, SIERxTimeOutEn, + //speedCtrlMux + fullSpeedRate, fullSpeedPol, + connectSlaveToHost, + //SCTxPortArbiter + SCTxPortEn, SCTxPortRdy, + SCTxPortData, SCTxPortCtrl, + //rxStatusMonitor + vBusDetect, + connectStateIn, + resumeDetectedIn, + //USBHostControlBI + busAddress, + busDataIn, + busDataOut, + busWriteEn, + busStrobe_i, + SOFRxedIntOut, + resetEventIntOut, + resumeIntOut, + transDoneIntOut, + vBusDetIntOut, + NAKSentIntOut, + slaveControlSelect, + //fifoMux + TxFifoEP0REn, + TxFifoEP1REn, + TxFifoEP2REn, + TxFifoEP3REn, + TxFifoEP0Data, + TxFifoEP1Data, + TxFifoEP2Data, + TxFifoEP3Data, + TxFifoEP0Empty, + TxFifoEP1Empty, + TxFifoEP2Empty, + TxFifoEP3Empty, + RxFifoEP0WEn, + RxFifoEP1WEn, + RxFifoEP2WEn, + RxFifoEP3WEn, + RxFifoEP0Full, + RxFifoEP1Full, + RxFifoEP2Full, + RxFifoEP3Full + ); + +input busClk; +input rstSyncToBusClk; +input usbClk; +input rstSyncToUsbClk; +//getPacket +input [7:0] RxByteStatus; +input [7:0] RxData; +input RxDataValid; +input SIERxTimeOut; +output SIERxTimeOutEn; +output [7:0] RxFifoData; +//speedCtrlMux +output fullSpeedRate; +output fullSpeedPol; +output connectSlaveToHost; +//HCTxPortArbiter +output SCTxPortEn; +input SCTxPortRdy; +output [7:0] SCTxPortData; +output [7:0] SCTxPortCtrl; +//rxStatusMonitor +input vBusDetect; +input [1:0] connectStateIn; +input resumeDetectedIn; +//USBHostControlBI +input [4:0] busAddress; +input [7:0] busDataIn; +output [7:0] busDataOut; +input busWriteEn; +input busStrobe_i; +output SOFRxedIntOut; +output resetEventIntOut; +output resumeIntOut; +output transDoneIntOut; +output vBusDetIntOut; +output NAKSentIntOut; +input slaveControlSelect; +//fifoMux +output TxFifoEP0REn; +output TxFifoEP1REn; +output TxFifoEP2REn; +output TxFifoEP3REn; +input [7:0] TxFifoEP0Data; +input [7:0] TxFifoEP1Data; +input [7:0] TxFifoEP2Data; +input [7:0] TxFifoEP3Data; +input TxFifoEP0Empty; +input TxFifoEP1Empty; +input TxFifoEP2Empty; +input TxFifoEP3Empty; +output RxFifoEP0WEn; +output RxFifoEP1WEn; +output RxFifoEP2WEn; +output RxFifoEP3WEn; +input RxFifoEP0Full; +input RxFifoEP1Full; +input RxFifoEP2Full; +input RxFifoEP3Full; + +wire busClk; +wire rstSyncToBusClk; +wire usbClk; +wire rstSyncToUsbClk; +wire [7:0] RxByteStatus; +wire [7:0] RxData; +wire RxDataValid; +wire SIERxTimeOut; +wire SIERxTimeOutEn; +wire [7:0] RxFifoData; +wire fullSpeedRate; +wire fullSpeedPol; +wire connectSlaveToHost; +wire [7:0] SCTxPortData; +wire [7:0] SCTxPortCtrl; +wire [1:0] connectStateIn; +wire resumeDetectedIn; +wire [4:0] busAddress; +wire [7:0] busDataIn; +wire [7:0] busDataOut; +wire busWriteEn; +wire busStrobe_i; +wire SOFRxedIntOut; +wire resetEventIntOut; +wire resumeIntOut; +wire transDoneIntOut; +wire vBusDetIntOut; +wire NAKSentIntOut; +wire slaveControlSelect; +wire TxFifoEP0REn; +wire TxFifoEP1REn; +wire TxFifoEP2REn; +wire TxFifoEP3REn; +wire [7:0] TxFifoEP0Data; +wire [7:0] TxFifoEP1Data; +wire [7:0] TxFifoEP2Data; +wire [7:0] TxFifoEP3Data; +wire TxFifoEP0Empty; +wire TxFifoEP1Empty; +wire TxFifoEP2Empty; +wire TxFifoEP3Empty; +wire RxFifoEP0WEn; +wire RxFifoEP1WEn; +wire RxFifoEP2WEn; +wire RxFifoEP3WEn; +wire RxFifoEP0Full; +wire RxFifoEP1Full; +wire RxFifoEP2Full; +wire RxFifoEP3Full; + +//internal wiring +wire [7:0] directCntlCntl; +wire [7:0] directCntlData; +wire directCntlGnt; +wire directCntlReq; +wire directCntlWEn; +wire [7:0] sendPacketCntl; +wire [7:0] sendPacketData; +wire sendPacketGnt; +wire sendPacketReq; +wire sendPacketWEn; +wire SCTxPortArbRdyOut; +wire transDone; +wire [1:0] directLineState; +wire directLineCtrlEn; +wire [3:0] RxPID; +wire [1:0] connectStateOut; +wire resumeIntFromRxStatusMon; +wire [1:0] endP0TransTypeReg; +wire [1:0] endP1TransTypeReg; +wire [1:0] endP2TransTypeReg; +wire [1:0] endP3TransTypeReg; +wire [1:0] endP0NAKTransTypeReg; +wire [1:0] endP1NAKTransTypeReg; +wire [1:0] endP2NAKTransTypeReg; +wire [1:0] endP3NAKTransTypeReg; +wire [4:0] endP0ControlReg; +wire [4:0] endP1ControlReg; +wire [4:0] endP2ControlReg; +wire [4:0] endP3ControlReg; +wire [7:0] endP0StatusReg; +wire [7:0] endP1StatusReg; +wire [7:0] endP2StatusReg; +wire [7:0] endP3StatusReg; +wire [6:0] USBTgtAddress; +wire [10:0] frameNum; +wire clrEP0Rdy; +wire clrEP1Rdy; +wire clrEP2Rdy; +wire clrEP3Rdy; +wire SCGlobalEn; +wire ACKRxed; +wire CRCError; +wire RXOverflow; +wire RXTimeOut; +wire bitStuffError; +wire dataSequence; +wire stallSent; +wire NAKSent; +wire SOFRxed; +wire [4:0] endPControlReg; +wire [1:0] transTypeNAK; +wire [1:0] transType; +wire [3:0] currEndP; +wire getPacketREn; +wire getPacketRdy; +wire [3:0] slaveControllerPIDOut; +wire slaveControllerReadyIn; +wire slaveControllerWEnOut; +wire TxFifoRE; +wire [7:0] TxFifoData; +wire TxFifoEmpty; +wire RxFifoWE; +wire RxFifoFull; +wire resetEventFromRxStatusMon; +wire clrEPRdy; +wire endPMuxErrorsWEn; +wire endPointReadyFromSlaveCtrlrToGetPkt; + +USBSlaveControlBI u_USBSlaveControlBI + (.address(busAddress), + .dataIn(busDataIn), + .dataOut(busDataOut), + .writeEn(busWriteEn), + .strobe_i(busStrobe_i), + .busClk(busClk), + .rstSyncToBusClk(rstSyncToBusClk), + .usbClk(usbClk), + .rstSyncToUsbClk(rstSyncToUsbClk), + .SOFRxedIntOut(SOFRxedIntOut), + .resetEventIntOut(resetEventIntOut), + .resumeIntOut(resumeIntOut), + .transDoneIntOut(transDoneIntOut), + .vBusDetIntOut(vBusDetIntOut), + .NAKSentIntOut(NAKSentIntOut), + .endP0TransTypeReg(endP0TransTypeReg), + .endP0NAKTransTypeReg(endP0NAKTransTypeReg), + .endP1TransTypeReg(endP1TransTypeReg), + .endP1NAKTransTypeReg(endP1NAKTransTypeReg), + .endP2TransTypeReg(endP2TransTypeReg), + .endP2NAKTransTypeReg(endP2NAKTransTypeReg), + .endP3TransTypeReg(endP3TransTypeReg), + .endP3NAKTransTypeReg(endP3NAKTransTypeReg), + .endP0ControlReg(endP0ControlReg), + .endP1ControlReg(endP1ControlReg), + .endP2ControlReg(endP2ControlReg), + .endP3ControlReg(endP3ControlReg), + .EP0StatusReg(endP0StatusReg), + .EP1StatusReg(endP1StatusReg), + .EP2StatusReg(endP2StatusReg), + .EP3StatusReg(endP3StatusReg), + .SCAddrReg(USBTgtAddress), + .frameNum(frameNum), + .connectStateIn(connectStateOut), + .vBusDetectIn(vBusDetect), + .SOFRxedIn(SOFRxed), + .resetEventIn(resetEventFromRxStatusMon), + .resumeIntIn(resumeIntFromRxStatusMon), + .transDoneIn(transDone), + .NAKSentIn(NAKSent), + .slaveControlSelect(slaveControlSelect), + .clrEP0Ready(clrEP0Rdy), + .clrEP1Ready(clrEP1Rdy), + .clrEP2Ready(clrEP2Rdy), + .clrEP3Ready(clrEP3Rdy), + .TxLineState(directLineState), + .LineDirectControlEn(directLineCtrlEn), + .fullSpeedPol(fullSpeedPol), + .fullSpeedRate(fullSpeedRate), + .connectSlaveToHost(connectSlaveToHost), + .SCGlobalEn(SCGlobalEn) + ); + +slavecontroller u_slavecontroller + (.CRCError(CRCError), + .NAKSent(NAKSent), + .RxByte(RxData), + .RxDataWEn(RxDataValid), + .RxOverflow(RXOverflow), + .RxStatus(RxByteStatus), + .RxTimeOut(RXTimeOut), + .SCGlobalEn(SCGlobalEn), + .SOFRxed(SOFRxed), + .USBEndPControlReg(endPControlReg), + .USBEndPNakTransTypeReg(transTypeNAK), + .USBEndPTransTypeReg(transType), + .USBEndP(currEndP), + .USBTgtAddress(USBTgtAddress), + .bitStuffError(bitStuffError), + .clk(usbClk), + .clrEPRdy(clrEPRdy), + .endPMuxErrorsWEn(endPMuxErrorsWEn), + .frameNum(frameNum), + .getPacketREn(getPacketREn), + .getPacketRdy(getPacketRdy), + .rst(rstSyncToUsbClk), + .sendPacketPID(slaveControllerPIDOut), + .sendPacketRdy(slaveControllerReadyIn), + .sendPacketWEn(slaveControllerWEnOut), + .stallSent(stallSent), + .transDone(transDone), + .endPointReadyToGetPkt(endPointReadyFromSlaveCtrlrToGetPkt) + ); + + +endpMux u_endpMux ( + .clk(usbClk), + .rst(rstSyncToUsbClk), + .currEndP(currEndP), + .NAKSent(NAKSent), + .stallSent(stallSent), + .CRCError(CRCError), + .bitStuffError(bitStuffError), + .RxOverflow(RXOverflow), + .RxTimeOut(RXTimeOut), + .dataSequence(dataSequence), + .ACKRxed(ACKRxed), + .transType(transType), + .transTypeNAK(transTypeNAK), + .endPControlReg(endPControlReg), + .clrEPRdy(clrEPRdy), + .endPMuxErrorsWEn(endPMuxErrorsWEn), + .endP0ControlReg(endP0ControlReg), + .endP1ControlReg(endP1ControlReg), + .endP2ControlReg(endP2ControlReg), + .endP3ControlReg(endP3ControlReg), + .endP0StatusReg(endP0StatusReg), + .endP1StatusReg(endP1StatusReg), + .endP2StatusReg(endP2StatusReg), + .endP3StatusReg(endP3StatusReg), + .endP0TransTypeReg(endP0TransTypeReg), + .endP1TransTypeReg(endP1TransTypeReg), + .endP2TransTypeReg(endP2TransTypeReg), + .endP3TransTypeReg(endP3TransTypeReg), + .endP0NAKTransTypeReg(endP0NAKTransTypeReg), + .endP1NAKTransTypeReg(endP1NAKTransTypeReg), + .endP2NAKTransTypeReg(endP2NAKTransTypeReg), + .endP3NAKTransTypeReg(endP3NAKTransTypeReg), + .clrEP0Rdy(clrEP0Rdy), + .clrEP1Rdy(clrEP1Rdy), + .clrEP2Rdy(clrEP2Rdy), + .clrEP3Rdy(clrEP3Rdy) + ); + +slaveSendPacket u_slaveSendPacket + (.PID(slaveControllerPIDOut), + .SCTxPortCntl(sendPacketCntl), + .SCTxPortData(sendPacketData), + .SCTxPortGnt(sendPacketGnt), + .SCTxPortRdy(SCTxPortArbRdyOut), + .SCTxPortReq(sendPacketReq), + .SCTxPortWEn(sendPacketWEn), + .clk(usbClk), + .fifoData(TxFifoData), + .fifoEmpty(TxFifoEmpty), + .fifoReadEn(TxFifoRE), + .rst(rstSyncToUsbClk), + .sendPacketRdy(slaveControllerReadyIn), + .sendPacketWEn(slaveControllerWEnOut) ); + +slaveDirectControl u_slaveDirectControl + (.SCTxPortCntl(directCntlCntl), + .SCTxPortData(directCntlData), + .SCTxPortGnt(directCntlGnt), + .SCTxPortRdy(SCTxPortArbRdyOut), + .SCTxPortReq(directCntlReq), + .SCTxPortWEn(directCntlWEn), + .clk(usbClk), + .directControlEn(directLineCtrlEn), + .directControlLineState(directLineState), + .rst(rstSyncToUsbClk) ); + +SCTxPortArbiter u_SCTxPortArbiter + (.SCTxPortCntl(SCTxPortCtrl), + .SCTxPortData(SCTxPortData), + .SCTxPortRdyIn(SCTxPortRdy), + .SCTxPortRdyOut(SCTxPortArbRdyOut), + .SCTxPortWEnable(SCTxPortEn), + .clk(usbClk), + .directCntlCntl(directCntlCntl), + .directCntlData(directCntlData), + .directCntlGnt(directCntlGnt), + .directCntlReq(directCntlReq), + .directCntlWEn(directCntlWEn), + .rst(rstSyncToUsbClk), + .sendPacketCntl(sendPacketCntl), + .sendPacketData(sendPacketData), + .sendPacketGnt(sendPacketGnt), + .sendPacketReq(sendPacketReq), + .sendPacketWEn(sendPacketWEn) ); + + +slaveGetPacket u_slaveGetPacket + (.ACKRxed(ACKRxed), + .CRCError(CRCError), + .RXDataIn(RxData), + .RXDataValid(RxDataValid), + .RXFifoData(RxFifoData), + .RXFifoFull(RxFifoFull), + .RXFifoWEn(RxFifoWE), + .RXPacketRdy(getPacketRdy), + .RXStreamStatusIn(RxByteStatus), + .RxPID(RxPID), + .SIERxTimeOut(SIERxTimeOut), + .SIERxTimeOutEn(SIERxTimeOutEn), + .clk(usbClk), + .RXOverflow(RXOverflow), + .RXTimeOut(RXTimeOut), + .bitStuffError(bitStuffError), + .dataSequence(dataSequence), + .getPacketEn(getPacketREn), + .rst(rstSyncToUsbClk), + .endPointReady(endPointReadyFromSlaveCtrlrToGetPkt) + ); + +slaveRxStatusMonitor u_slaveRxStatusMonitor + (.connectStateIn(connectStateIn), + .connectStateOut(connectStateOut), + .resumeDetectedIn(resumeDetectedIn), + .resetEventOut(resetEventFromRxStatusMon), + .resumeIntOut(resumeIntFromRxStatusMon), + .clk(usbClk), + .rst(rstSyncToUsbClk) ); + +fifoMux u_fifoMux ( + .currEndP(currEndP), + //TxFifo + .TxFifoREn(TxFifoRE), + .TxFifoEP0REn(TxFifoEP0REn), + .TxFifoEP1REn(TxFifoEP1REn), + .TxFifoEP2REn(TxFifoEP2REn), + .TxFifoEP3REn(TxFifoEP3REn), + .TxFifoData(TxFifoData), + .TxFifoEP0Data(TxFifoEP0Data), + .TxFifoEP1Data(TxFifoEP1Data), + .TxFifoEP2Data(TxFifoEP2Data), + .TxFifoEP3Data(TxFifoEP3Data), + .TxFifoEmpty(TxFifoEmpty), + .TxFifoEP0Empty(TxFifoEP0Empty), + .TxFifoEP1Empty(TxFifoEP1Empty), + .TxFifoEP2Empty(TxFifoEP2Empty), + .TxFifoEP3Empty(TxFifoEP3Empty), + //RxFifo + .RxFifoWEn(RxFifoWE), + .RxFifoEP0WEn(RxFifoEP0WEn), + .RxFifoEP1WEn(RxFifoEP1WEn), + .RxFifoEP2WEn(RxFifoEP2WEn), + .RxFifoEP3WEn(RxFifoEP3WEn), + .RxFifoFull(RxFifoFull), + .RxFifoEP0Full(RxFifoEP0Full), + .RxFifoEP1Full(RxFifoEP1Full), + .RxFifoEP2Full(RxFifoEP2Full), + .RxFifoEP3Full(RxFifoEP3Full) + ); + +endmodule + + + + + + + Index: Actel/usbDeviceActelTop/hdl/checkLineState.v =================================================================== --- Actel/usbDeviceActelTop/hdl/checkLineState.v (nonexistent) +++ Actel/usbDeviceActelTop/hdl/checkLineState.v (revision 40) @@ -0,0 +1,202 @@ + +////////////////////////////////////////////////////////////////////// +//// //// +//// checkLineState.v //// +//// //// +//// This file is part of the usbHostSlave opencores effort. +//// //// +//// //// +//// Module Description: //// +//// Checks USB line state. When reset state detected +//// asserts usbRstDet for one clock tick +//// usbRstDet is used to reset most of the logic. +//// +//// //// +//// To Do: //// +//// +//// //// +//// Author(s): //// +//// - Steve Fielding, sfielding@base2designs.com //// +//// //// +////////////////////////////////////////////////////////////////////// +//// //// +//// Copyright (C) 2008 Steve Fielding and OPENCORES.ORG //// +//// //// +//// This source file may be used and distributed without //// +//// restriction provided that this copyright statement is not //// +//// removed from the file and that any derivative work contains //// +//// the original copyright notice and the associated disclaimer. //// +//// //// +//// This source file is free software; you can redistribute it //// +//// and/or modify it under the terms of the GNU Lesser General //// +//// Public License as published by the Free Software Foundation; //// +//// either version 2.1 of the License, or (at your option) any //// +//// later version. //// +//// //// +//// This source is distributed in the hope that it will be //// +//// useful, but WITHOUT ANY WARRANTY; without even the implied //// +//// warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR //// +//// PURPOSE. See the GNU Lesser General Public License for more //// +//// details. //// +//// //// +//// You should have received a copy of the GNU Lesser General //// +//// Public License along with this source; if not, download it //// +//// from //// +//// //// +////////////////////////////////////////////////////////////////////// +// +`include "timescale.v" +`include "usbSlaveControl_h.v" +`include "usbHostSlaveReg_define.v" +`include "usbSerialInterfaceEngine_h.v" +`include "usbDevice_define.v" +module checkLineState (clk, initComplete, rst, usbRstDet, wb_ack, wb_addr, wb_data_i, wb_stb, wb_we, wbBusGnt, wbBusReq); +input clk; +input initComplete; +input rst; +input wb_ack; +input [7:0]wb_data_i; +input wbBusGnt; +output usbRstDet; +output [7:0]wb_addr; +output wb_stb; +output wb_we; +output wbBusReq; + +wire clk; +wire initComplete; +wire rst; +reg usbRstDet, next_usbRstDet; +wire wb_ack; +reg [7:0]wb_addr, next_wb_addr; +wire [7:0]wb_data_i; +reg wb_stb, next_wb_stb; +reg wb_we, next_wb_we; +wire wbBusGnt; +reg wbBusReq, next_wbBusReq; + +// diagram signals declarations +reg [15:0]cnt, next_cnt; +reg [1:0]resetState, next_resetState; + +// BINARY ENCODED state machine: chkLSt +// State codes definitions: +`define START 3'b000 +`define GET_STAT 3'b001 +`define WT_GNT 3'b010 +`define SET_RST_DET 3'b011 +`define DEL_ONE_MSEC 3'b100 + +reg [2:0]CurrState_chkLSt, NextState_chkLSt; + +// Diagram actions (continuous assignments allowed only: assign ...) +// diagram ACTION + + +// Machine: chkLSt + +// NextState logic (combinatorial) +always @ (initComplete or wb_ack or resetState or wbBusGnt or cnt or usbRstDet or wbBusReq or wb_addr or wb_stb or wb_we or CurrState_chkLSt) +begin + NextState_chkLSt <= CurrState_chkLSt; + // Set default values for outputs and signals + next_usbRstDet <= usbRstDet; + next_wbBusReq <= wbBusReq; + next_wb_addr <= wb_addr; + next_wb_stb <= wb_stb; + next_wb_we <= wb_we; + next_cnt <= cnt; + next_resetState <= resetState; + case (CurrState_chkLSt) // synopsys parallel_case full_case + `START: + begin + next_usbRstDet <= 1'b0; + next_wbBusReq <= 1'b0; + next_wb_addr <= 8'h00; + next_wb_stb <= 1'b0; + next_wb_we <= 1'b0; + next_cnt <= 16'h0000; + next_resetState <= 2'b00; + if (initComplete == 1'b1) + begin + NextState_chkLSt <= `WT_GNT; + end + end + `GET_STAT: + begin + next_wb_addr <= `RA_SC_LINE_STATUS_REG; + next_wb_stb <= 1'b1; + next_wb_we <= 1'b1; + if (wb_ack == 1'b1) + begin + NextState_chkLSt <= `SET_RST_DET; + next_wb_stb <= 1'b0; + if ( (wb_data_i[1:0] == `DISCONNECT) || (wb_data_i[`VBUS_PRES_BIT] == 1'b0) ) + next_resetState <= {resetState[0], 1'b1}; + else + next_resetState <= 2'b00; + next_wbBusReq <= 1'b0; + end + end + `WT_GNT: + begin + next_wbBusReq <= 1'b1; + if (wbBusGnt == 1'b1) + begin + NextState_chkLSt <= `GET_STAT; + end + end + `SET_RST_DET: + begin + NextState_chkLSt <= `DEL_ONE_MSEC; + if (resetState == 2'b11) // if reset condition aserted for 2mS + next_usbRstDet <= 1'b1; + next_cnt <= 16'h0000; + end + `DEL_ONE_MSEC: + begin + next_cnt <= cnt + 1'b1; + next_usbRstDet <= 1'b0; + if (cnt == `ONE_MSEC_DEL) + begin + NextState_chkLSt <= `WT_GNT; + end + end + endcase +end + +// Current State Logic (sequential) +always @ (posedge clk) +begin + if (rst == 1'b1) + CurrState_chkLSt <= `START; + else + CurrState_chkLSt <= NextState_chkLSt; +end + +// Registered outputs logic +always @ (posedge clk) +begin + if (rst == 1'b1) + begin + usbRstDet <= 1'b0; + wbBusReq <= 1'b0; + wb_addr <= 8'h00; + wb_stb <= 1'b0; + wb_we <= 1'b0; + cnt <= 16'h0000; + resetState <= 2'b00; + end + else + begin + usbRstDet <= next_usbRstDet; + wbBusReq <= next_wbBusReq; + wb_addr <= next_wb_addr; + wb_stb <= next_wb_stb; + wb_we <= next_wb_we; + cnt <= next_cnt; + resetState <= next_resetState; + end +end + +endmodule \ No newline at end of file Index: Actel/usbDeviceActelTop/hdl/processRxBit.v =================================================================== --- Actel/usbDeviceActelTop/hdl/processRxBit.v (nonexistent) +++ Actel/usbDeviceActelTop/hdl/processRxBit.v (revision 40) @@ -0,0 +1,403 @@ + +// File : ../RTL/serialInterfaceEngine/processRxBit.v +// Generated : 11/10/06 05:37:22 +// From : ../RTL/serialInterfaceEngine/processRxBit.asf +// By : FSM2VHDL ver. 5.0.0.9 + +////////////////////////////////////////////////////////////////////// +//// //// +//// processrxbit +//// //// +//// This file is part of the usbhostslave opencores effort. +//// http://www.opencores.org/cores/usbhostslave/ //// +//// //// +//// Module Description: //// +//// +//// //// +//// To Do: //// +//// +//// //// +//// Author(s): //// +//// - Steve Fielding, sfielding@base2designs.com //// +//// //// +////////////////////////////////////////////////////////////////////// +//// //// +//// Copyright (C) 2004 Steve Fielding and OPENCORES.ORG //// +//// //// +//// This source file may be used and distributed without //// +//// restriction provided that this copyright statement is not //// +//// removed from the file and that any derivative work contains //// +//// the original copyright notice and the associated disclaimer. //// +//// //// +//// This source file is free software; you can redistribute it //// +//// and/or modify it under the terms of the GNU Lesser General //// +//// Public License as published by the Free Software Foundation; //// +//// either version 2.1 of the License, or (at your option) any //// +//// later version. //// +//// //// +//// This source is distributed in the hope that it will be //// +//// useful, but WITHOUT ANY WARRANTY; without even the implied //// +//// warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR //// +//// PURPOSE. See the GNU Lesser General Public License for more //// +//// details. //// +//// //// +//// You should have received a copy of the GNU Lesser General //// +//// Public License along with this source; if not, download it //// +//// from http://www.opencores.org/lgpl.shtml //// +//// //// +////////////////////////////////////////////////////////////////////// +// +`include "timescale.v" +`include "usbSerialInterfaceEngine_h.v" + + +module processRxBit (JBit, KBit, RxBitsIn, RxCtrlOut, RxDataOut, RxWireActive, clk, processRxBitRdy, processRxBitsWEn, processRxByteRdy, processRxByteWEn, resumeDetected, rst); +input [1:0] JBit; +input [1:0] KBit; +input [1:0] RxBitsIn; +input RxWireActive; +input clk; +input processRxBitsWEn; +input processRxByteRdy; +input rst; +output [7:0] RxCtrlOut; +output [7:0] RxDataOut; +output processRxBitRdy; +output processRxByteWEn; +output resumeDetected; + +wire [1:0] JBit; +wire [1:0] KBit; +wire [1:0] RxBitsIn; +reg [7:0] RxCtrlOut, next_RxCtrlOut; +reg [7:0] RxDataOut, next_RxDataOut; +wire RxWireActive; +wire clk; +reg processRxBitRdy, next_processRxBitRdy; +wire processRxBitsWEn; +wire processRxByteRdy; +reg processRxByteWEn, next_processRxByteWEn; +reg resumeDetected, next_resumeDetected; +wire rst; + +// diagram signals declarations +reg [3:0]RXBitCount, next_RXBitCount; +reg [1:0]RXBitStMachCurrState, next_RXBitStMachCurrState; +reg [7:0]RXByte, next_RXByte; +reg [3:0]RXSameBitCount, next_RXSameBitCount; +reg [1:0]RxBits, next_RxBits; +reg bitStuffError, next_bitStuffError; +reg [1:0]oldRXBits, next_oldRXBits; +reg [4:0]resumeWaitCnt, next_resumeWaitCnt; + +// BINARY ENCODED state machine: prRxBit +// State codes definitions: +`define START 4'b0000 +`define IDLE_FIRST_BIT 4'b0001 +`define WAIT_BITS 4'b0010 +`define IDLE_CHK_KBIT 4'b0011 +`define DATA_RX_LAST_BIT 4'b0100 +`define DATA_RX_CHK_SE0 4'b0101 +`define DATA_RX_DATA_DESTUFF 4'b0110 +`define DATA_RX_BYTE_SEND2 4'b0111 +`define DATA_RX_BYTE_WAIT_RDY 4'b1000 +`define RES_RX_CHK 4'b1001 +`define DATA_RX_ERROR_CHK_RES 4'b1010 +`define RES_END_CHK1 4'b1011 +`define IDLE_WAIT_PRB_RDY 4'b1100 +`define DATA_RX_WAIT_PRB_RDY 4'b1101 +`define DATA_RX_ERROR_WAIT_RDY 4'b1110 + +reg [3:0] CurrState_prRxBit; +reg [3:0] NextState_prRxBit; + + +//-------------------------------------------------------------------- +// Machine: prRxBit +//-------------------------------------------------------------------- +//---------------------------------- +// Next State Logic (combinatorial) +//---------------------------------- +always @ (RxBitsIn or RxBits or oldRXBits or RXSameBitCount or RXBitCount or RXByte or JBit or KBit or resumeWaitCnt or processRxBitsWEn or RXBitStMachCurrState or RxWireActive or processRxByteRdy or bitStuffError or processRxByteWEn or RxCtrlOut or RxDataOut or resumeDetected or processRxBitRdy or CurrState_prRxBit) +begin : prRxBit_NextState + NextState_prRxBit <= CurrState_prRxBit; + // Set default values for outputs and signals + next_processRxByteWEn <= processRxByteWEn; + next_RxCtrlOut <= RxCtrlOut; + next_RxDataOut <= RxDataOut; + next_resumeDetected <= resumeDetected; + next_RXBitStMachCurrState <= RXBitStMachCurrState; + next_RxBits <= RxBits; + next_RXSameBitCount <= RXSameBitCount; + next_RXBitCount <= RXBitCount; + next_oldRXBits <= oldRXBits; + next_RXByte <= RXByte; + next_bitStuffError <= bitStuffError; + next_resumeWaitCnt <= resumeWaitCnt; + next_processRxBitRdy <= processRxBitRdy; + case (CurrState_prRxBit) + `START: + begin + next_processRxByteWEn <= 1'b0; + next_RxCtrlOut <= 8'h00; + next_RxDataOut <= 8'h00; + next_resumeDetected <= 1'b0; + next_RXBitStMachCurrState <= `IDLE_BIT_ST; + next_RxBits <= 2'b00; + next_RXSameBitCount <= 4'h0; + next_RXBitCount <= 4'h0; + next_oldRXBits <= 2'b00; + next_RXByte <= 8'h00; + next_bitStuffError <= 1'b0; + next_resumeWaitCnt <= 5'h0; + next_processRxBitRdy <= 1'b1; + NextState_prRxBit <= `WAIT_BITS; + end + `WAIT_BITS: + if ((processRxBitsWEn == 1'b1) && (RXBitStMachCurrState == `WAIT_RESUME_ST)) + begin + NextState_prRxBit <= `RES_RX_CHK; + next_RxBits <= RxBitsIn; + next_processRxBitRdy <= 1'b0; + end + else if ((processRxBitsWEn == 1'b1) && (RXBitStMachCurrState == `DATA_RECEIVE_BIT_ST)) + begin + NextState_prRxBit <= `DATA_RX_CHK_SE0; + next_RxBits <= RxBitsIn; + next_processRxBitRdy <= 1'b0; + end + else if ((processRxBitsWEn == 1'b1) && (RXBitStMachCurrState == `IDLE_BIT_ST)) + begin + NextState_prRxBit <= `IDLE_CHK_KBIT; + next_RxBits <= RxBitsIn; + next_processRxBitRdy <= 1'b0; + end + else if ((processRxBitsWEn == 1'b1) && (RXBitStMachCurrState == `RESUME_END_WAIT_ST)) + begin + NextState_prRxBit <= `RES_END_CHK1; + next_RxBits <= RxBitsIn; + next_processRxBitRdy <= 1'b0; + end + `IDLE_FIRST_BIT: + begin + next_processRxByteWEn <= 1'b0; + next_RXBitStMachCurrState <= `DATA_RECEIVE_BIT_ST; + next_RXSameBitCount <= 4'h0; + next_RXBitCount <= 4'h1; + next_oldRXBits <= RxBits; + //zero is always the first RZ data bit of a new packet + next_RXByte <= 8'h00; + NextState_prRxBit <= `WAIT_BITS; + next_processRxBitRdy <= 1'b1; + end + `IDLE_CHK_KBIT: + if ((RxBits == KBit) && (RxWireActive == 1'b1)) + NextState_prRxBit <= `IDLE_WAIT_PRB_RDY; + else + begin + NextState_prRxBit <= `WAIT_BITS; + next_processRxBitRdy <= 1'b1; + end + `IDLE_WAIT_PRB_RDY: + if (processRxByteRdy == 1'b1) + begin + NextState_prRxBit <= `IDLE_FIRST_BIT; + next_RxDataOut <= 8'h00; + //redundant data + next_RxCtrlOut <= `DATA_START; + //start of packet + next_processRxByteWEn <= 1'b1; + end + `DATA_RX_LAST_BIT: + begin + next_processRxByteWEn <= 1'b0; + next_RXBitStMachCurrState <= `IDLE_BIT_ST; + NextState_prRxBit <= `WAIT_BITS; + next_processRxBitRdy <= 1'b1; + end + `DATA_RX_CHK_SE0: + begin + next_bitStuffError <= 1'b0; + if (RxBits == `SE0) + NextState_prRxBit <= `DATA_RX_WAIT_PRB_RDY; + else + begin + NextState_prRxBit <= `DATA_RX_DATA_DESTUFF; + if (RxBits == oldRXBits) //if the current 'RxBits' are the same as the old 'RxBits', then + begin + next_RXSameBitCount <= RXSameBitCount + 1'b1; + //inc 'RXSameBitCount' + if (RXSameBitCount == `MAX_CONSEC_SAME_BITS) //if 'RXSameBitCount' == 6 there has been a bit stuff error + next_bitStuffError <= 1'b1; + //flag 'bitStuffError' + else //else no bit stuffing error + begin + next_RXBitCount <= RXBitCount + 1'b1; + if (RXBitCount != `MAX_CONSEC_SAME_BITS_PLUS1) begin + next_processRxBitRdy <= 1'b1; + //early indication of ready + end + next_RXByte <= { 1'b1, RXByte[7:1]}; + //RZ bit = 1 (ie no change in 'RxBits') + end + end + else //else current 'RxBits' are different from old 'RxBits' + begin + if (RXSameBitCount != `MAX_CONSEC_SAME_BITS) //if this is not the RZ 0 bit after 6 consecutive RZ 1s, then + begin + next_RXBitCount <= RXBitCount + 1'b1; + if (RXBitCount != 4'h7) begin + next_processRxBitRdy <= 1'b1; + //early indication of ready + end + next_RXByte <= {1'b0, RXByte[7:1]}; + //RZ bit = 0 (ie current'RxBits' is different than old 'RxBits') + end + next_RXSameBitCount <= 4'h0; + //reset 'RXSameBitCount' + end + next_oldRXBits <= RxBits; + end + end + `DATA_RX_WAIT_PRB_RDY: + if (processRxByteRdy == 1'b1) + begin + NextState_prRxBit <= `DATA_RX_LAST_BIT; + next_RxDataOut <= 8'h00; + //redundant data + next_RxCtrlOut <= `DATA_STOP; + //end of packet + next_processRxByteWEn <= 1'b1; + end + `DATA_RX_DATA_DESTUFF: + if (RXBitCount == 4'h8 & bitStuffError == 1'b0) + NextState_prRxBit <= `DATA_RX_BYTE_WAIT_RDY; + else if (bitStuffError == 1'b1) + NextState_prRxBit <= `DATA_RX_ERROR_WAIT_RDY; + else + begin + NextState_prRxBit <= `WAIT_BITS; + next_processRxBitRdy <= 1'b1; + end + `DATA_RX_BYTE_SEND2: + begin + next_processRxByteWEn <= 1'b0; + NextState_prRxBit <= `WAIT_BITS; + next_processRxBitRdy <= 1'b1; + end + `DATA_RX_BYTE_WAIT_RDY: + if (processRxByteRdy == 1'b1) + begin + NextState_prRxBit <= `DATA_RX_BYTE_SEND2; + next_RXBitCount <= 4'h0; + next_RxDataOut <= RXByte; + next_RxCtrlOut <= `DATA_STREAM; + next_processRxByteWEn <= 1'b1; + end + `DATA_RX_ERROR_CHK_RES: + begin + next_processRxByteWEn <= 1'b0; + if (RxBits == JBit) //if current bit is a JBit, then + next_RXBitStMachCurrState <= `IDLE_BIT_ST; + //next state is idle + else //else + begin + next_RXBitStMachCurrState <= `WAIT_RESUME_ST; + //check for resume + next_resumeWaitCnt <= 5'h0; + end + NextState_prRxBit <= `WAIT_BITS; + next_processRxBitRdy <= 1'b1; + end + `DATA_RX_ERROR_WAIT_RDY: + if (processRxByteRdy == 1'b1) + begin + NextState_prRxBit <= `DATA_RX_ERROR_CHK_RES; + next_RxDataOut <= 8'h00; + //redundant data + next_RxCtrlOut <= `DATA_BIT_STUFF_ERROR; + next_processRxByteWEn <= 1'b1; + end + `RES_RX_CHK: + begin + if (RxBits != KBit) //can only be a resume if line remains in Kbit state + next_RXBitStMachCurrState <= `IDLE_BIT_ST; + else + begin + next_resumeWaitCnt <= resumeWaitCnt + 1'b1; + //if we've waited long enough, then + if (resumeWaitCnt == `RESUME_RX_WAIT_TIME) + begin + next_RXBitStMachCurrState <= `RESUME_END_WAIT_ST; + next_resumeDetected <= 1'b1; + //report resume detected + end + end + NextState_prRxBit <= `WAIT_BITS; + next_processRxBitRdy <= 1'b1; + end + `RES_END_CHK1: + begin + if (RxBits != KBit) //line must leave KBit state for the end of resume + begin + next_RXBitStMachCurrState <= `IDLE_BIT_ST; + next_resumeDetected <= 1'b0; + //clear resume detected flag + end + NextState_prRxBit <= `WAIT_BITS; + next_processRxBitRdy <= 1'b1; + end + endcase +end + +//---------------------------------- +// Current State Logic (sequential) +//---------------------------------- +always @ (posedge clk) +begin : prRxBit_CurrentState + if (rst) + CurrState_prRxBit <= `START; + else + CurrState_prRxBit <= NextState_prRxBit; +end + +//---------------------------------- +// Registered outputs logic +//---------------------------------- +always @ (posedge clk) +begin : prRxBit_RegOutput + if (rst) + begin + RXBitStMachCurrState <= `IDLE_BIT_ST; + RxBits <= 2'b00; + RXSameBitCount <= 4'h0; + RXBitCount <= 4'h0; + oldRXBits <= 2'b00; + RXByte <= 8'h00; + bitStuffError <= 1'b0; + resumeWaitCnt <= 5'h0; + processRxByteWEn <= 1'b0; + RxCtrlOut <= 8'h00; + RxDataOut <= 8'h00; + resumeDetected <= 1'b0; + processRxBitRdy <= 1'b1; + end + else + begin + RXBitStMachCurrState <= next_RXBitStMachCurrState; + RxBits <= next_RxBits; + RXSameBitCount <= next_RXSameBitCount; + RXBitCount <= next_RXBitCount; + oldRXBits <= next_oldRXBits; + RXByte <= next_RXByte; + bitStuffError <= next_bitStuffError; + resumeWaitCnt <= next_resumeWaitCnt; + processRxByteWEn <= next_processRxByteWEn; + RxCtrlOut <= next_RxCtrlOut; + RxDataOut <= next_RxDataOut; + resumeDetected <= next_resumeDetected; + processRxBitRdy <= next_processRxBitRdy; + end +end + +endmodule \ No newline at end of file Index: Actel/usbDeviceActelTop/hdl/usbDeviceXilinxTop.v =================================================================== --- Actel/usbDeviceActelTop/hdl/usbDeviceXilinxTop.v (nonexistent) +++ Actel/usbDeviceActelTop/hdl/usbDeviceXilinxTop.v (revision 40) @@ -0,0 +1,92 @@ + +module usbDeviceXilinxTop ( + + // + // Global signals + // + clk, + + // + // misc Starter Kit control sigs + // + E_NRST, + SPI_SCK, + NF_CE, + SD_CS, + + // + // USB slave + // + usbSlaveVP, + usbSlaveVM, + usbSlaveOE_n, + usbDPlusPullup + +); + + // + // Global signals + // + input clk; + + // + // misc Starter Kit control sigs + // + output E_NRST; + output SPI_SCK; + output NF_CE; + output SD_CS; + + // + // USB slave + // + inout usbSlaveVP; + inout usbSlaveVM; + output usbSlaveOE_n; + output usbDPlusPullup; + +//local wires and regs +reg [1:0] rstReg; +wire rst; +wire pll_locked; +wire clk48MHz; + + +assign E_NRST = 1'b0; +assign SPI_SCK = 1'b0; +assign NF_CE = 1'b0; +assign SD_CS = 1'b1; + + +pll_48MHz_xilinx pll_48MHz_inst ( + .CLKIN_IN ( clk ), + .CLK0_OUT (clk48MHz), + .LOCKED_OUT( pll_locked) + ); + +//generate sync reset from pll lock signal +always @(posedge clk48MHz) begin + rstReg[1:0] <= {rstReg[0], ~pll_locked}; +end +assign rst = rstReg[1]; + + +usbDevice u_usbDevice ( + .clk(clk48MHz), + .rst(rst), + .usbSlaveVP_in(usbSlaveVP_in), + .usbSlaveVM_in(usbSlaveVM_in), + .usbSlaveVP_out(usbSlaveVP_out), + .usbSlaveVM_out(usbSlaveVM_out), + .usbSlaveOE_n(usbSlaveOE_n), + .usbDPlusPullup(usbDPlusPullup), + .vBusDetect(1'b1) +); + + +assign {usbSlaveVP_in, usbSlaveVM_in} = {usbSlaveVP, usbSlaveVM}; +assign {usbSlaveVP, usbSlaveVM} = (usbSlaveOE_n == 1'b0) ? {usbSlaveVP_out, usbSlaveVM_out} : 2'bzz; + +endmodule + + Index: Actel/usbDeviceActelTop/hdl/usbHostSlaveReg_define.v =================================================================== --- Actel/usbDeviceActelTop/hdl/usbHostSlaveReg_define.v (nonexistent) +++ Actel/usbDeviceActelTop/hdl/usbHostSlaveReg_define.v (revision 40) @@ -0,0 +1,78 @@ +// ------------------------------ usbHostSlaveReg_define.v ---------------------------- +`include "wishBoneBus_h.v" +`include "usbHostSlave_h.v" + + + +`define RA_EP0_CONTROL_REG `SCREG_BASE+`ENDPOINT_CONTROL_REG +`define RA_EP0_STATUS_REG `SCREG_BASE+`ENDPOINT_STATUS_REG +`define RA_EP0_TRANSTYPE_STATUS_REG `SCREG_BASE+`ENDPOINT_TRANSTYPE_STATUS_REG +`define RA_EP0_NAK_TRANSTYPE_STATUS_REG `SCREG_BASE+`NAK_TRANSTYPE_STATUS_REG +`define RA_EP1_CONTROL_REG `SCREG_BASE+`NUM_OF_REGISTERS_PER_ENDPOINT+`ENDPOINT_CONTROL_REG +`define RA_EP1_STATUS_REG `SCREG_BASE+`NUM_OF_REGISTERS_PER_ENDPOINT+`ENDPOINT_STATUS_REG +`define RA_EP1_TRANSTYPE_STATUS_REG `SCREG_BASE+`NUM_OF_REGISTERS_PER_ENDPOINT+`ENDPOINT_TRANSTYPE_STATUS_REG +`define RA_EP1_NAK_TRANSTYPE_STATUS_REG `SCREG_BASE+`NUM_OF_REGISTERS_PER_ENDPOINT+`NAK_TRANSTYPE_STATUS_REG +`define RA_EP2_CONTROL_REG `SCREG_BASE+(`NUM_OF_REGISTERS_PER_ENDPOINT*2)+`ENDPOINT_CONTROL_REG +`define RA_EP2_STATUS_REG `SCREG_BASE+(`NUM_OF_REGISTERS_PER_ENDPOINT*2)+`ENDPOINT_STATUS_REG +`define RA_EP2_TRANSTYPE_STATUS_REG `SCREG_BASE+(`NUM_OF_REGISTERS_PER_ENDPOINT*2)`+`ENDPOINT_TRANSTYPE_STATUS_REG +`define RA_EP2_NAK_TRANSTYPE_STATUS_REG `SCREG_BASE+(`NUM_OF_REGISTERS_PER_ENDPOINT*2)+`NAK_TRANSTYPE_STATUS_REG +`define RA_EP3_CONTROL_REG `SCREG_BASE+(`NUM_OF_REGISTERS_PER_ENDPOINT*3)+`ENDPOINT_CONTROL_REG +`define RA_EP3_STATUS_REG `SCREG_BASE+(`NUM_OF_REGISTERS_PER_ENDPOINT*3)+`ENDPOINT_STATUS_REG +`define RA_EP3_TRANSTYPE_STATUS_REG `SCREG_BASE+(NUM_OF_REGISTERS_PER_ENDPOINT*3)+`ENDPOINT_TRANSTYPE_STATUS_REG +`define RA_EP3_NAK_TRANSTYPE_STATUS_REG `SCREG_BASE+(`NUM_OF_REGISTERS_PER_ENDPOINT*3)+`NAK_TRANSTYPE_STATUS_REG +`define RA_SC_CONTROL_REG `SCREG_BASE+`SC_CONTROL_REG +`define RA_SC_LINE_STATUS_REG `SCREG_BASE+`SC_LINE_STATUS_REG +`define RA_SC_INTERRUPT_STATUS_REG `SCREG_BASE+`SC_INTERRUPT_STATUS_REG +`define RA_SC_INTERRUPT_MASK_REG `SCREG_BASE+`SC_INTERRUPT_MASK_REG +`define RA_SC_ADDRESS `SCREG_BASE+`SC_ADDRESS +`define RA_SC_FRAME_NUM_MSP `SCREG_BASE+`SC_FRAME_NUM_MSP +`define RA_SC_FRAME_NUM_LSP `SCREG_BASE+`SC_FRAME_NUM_LSP + +`define RA_EP0_RX_FIFO_DATA_REG `EP0_RX_FIFO_BASE+`FIFO_DATA_REG +`define RA_EP0_RX_FIFO_STATUS_REG `EP0_RX_FIFO_BASE+`FIFO_STATUS_REG +`define RA_EP0_RX_FIFO_DATA_COUNT_MSB `EP0_RX_FIFO_BASE+`FIFO_DATA_COUNT_MSB +`define RA_EP0_RX_FIFO_DATA_COUNT_LSB `EP0_RX_FIFO_BASE+`FIFO_DATA_COUNT_LSB +`define RA_EP0_RX_FIFO_CONTROL_REG `EP0_RX_FIFO_BASE+`FIFO_CONTROL_REG +`define RA_EP0_TX_FIFO_DATA_REG `EP0_TX_FIFO_BASE+`FIFO_DATA_REG +`define RA_EP0_TX_FIFO_STATUS_REG `EP0_TX_FIFO_BASE+`FIFO_STATUS_REG +`define RA_EP0_TX_FIFO_DATA_COUNT_MSB `EP0_TX_FIFO_BASE+`FIFO_DATA_COUNT_MSB +`define RA_EP0_TX_FIFO_DATA_COUNT_LSB `EP0_TX_FIFO_BASE+`FIFO_DATA_COUNT_LSB +`define RA_EP0_TX_FIFO_CONTROL_REG `EP0_TX_FIFO_BASE+`FIFO_CONTROL_REG + +`define RA_EP1_RX_FIFO_DATA_REG `EP1_RX_FIFO_BASE+`FIFO_DATA_REG +`define RA_EP1_RX_FIFO_STATUS_REG `EP1_RX_FIFO_BASE+`FIFO_STATUS_REG +`define RA_EP1_RX_FIFO_DATA_COUNT_MSB `EP1_RX_FIFO_BASE+`FIFO_DATA_COUNT_MSB +`define RA_EP1_RX_FIFO_DATA_COUNT_LSB `EP1_RX_FIFO_BASE+`FIFO_DATA_COUNT_LSB +`define RA_EP1_RX_FIFO_CONTROL_REG `EP1_RX_FIFO_BASE+`FIFO_CONTROL_REG +`define RA_EP1_TX_FIFO_DATA_REG `EP1_TX_FIFO_BASE+`FIFO_DATA_REG +`define RA_EP1_TX_FIFO_STATUS_REG `EP1_TX_FIFO_BASE+`FIFO_STATUS_REG +`define RA_EP1_TX_FIFO_DATA_COUNT_MSB `EP1_TX_FIFO_BASE+`FIFO_DATA_COUNT_MSB +`define RA_EP1_TX_FIFO_DATA_COUNT_LSB `EP1_TX_FIFO_BASE+`FIFO_DATA_COUNT_LSB +`define RA_EP1_TX_FIFO_CONTROL_REG `EP1_TX_FIFO_BASE+`FIFO_CONTROL_REG + +`define RA_EP2_RX_FIFO_DATA_REG `EP2_RX_FIFO_BASE+`FIFO_DATA_REG +`define RA_EP2_RX_FIFO_STATUS_REG `EP2_RX_FIFO_BASE+`FIFO_STATUS_REG +`define RA_EP2_RX_FIFO_DATA_COUNT_MSB `EP2_RX_FIFO_BASE+`FIFO_DATA_COUNT_MSB +`define RA_EP2_RX_FIFO_DATA_COUNT_LSB `EP2_RX_FIFO_BASE+`FIFO_DATA_COUNT_LSB +`define RA_EP2_RX_FIFO_CONTROL_REG `EP2_RX_FIFO_BASE+`FIFO_CONTROL_REG +`define RA_EP2_TX_FIFO_DATA_REG `EP2_TX_FIFO_BASE+`FIFO_DATA_REG +`define RA_EP2_TX_FIFO_STATUS_REG `EP2_TX_FIFO_BASE+`FIFO_STATUS_REG +`define RA_EP2_TX_FIFO_DATA_COUNT_MSB `EP2_TX_FIFO_BASE+`FIFO_DATA_COUNT_MSB +`define RA_EP2_TX_FIFO_DATA_COUNT_LSB `EP2_TX_FIFO_BASE+`FIFO_DATA_COUNT_LSB +`define RA_EP2_TX_FIFO_CONTROL_REG `EP2_TX_FIFO_BASE+`FIFO_CONTROL_REG + +`define RA_EP3_RX_FIFO_DATA_REG `EP3_RX_FIFO_BASE+`FIFO_DATA_REG +`define RA_EP3_RX_FIFO_STATUS_REG `EP3_RX_FIFO_BASE+`FIFO_STATUS_REG +`define RA_EP3_RX_FIFO_DATA_COUNT_MSB `EP3_RX_FIFO_BASE+`FIFO_DATA_COUNT_MSB +`define RA_EP3_RX_FIFO_DATA_COUNT_LSB `EP3_RX_FIFO_BASE+`FIFO_DATA_COUNT_LSB +`define RA_EP3_RX_FIFO_CONTROL_REG `EP3_RX_FIFO_BASE+`FIFO_CONTROL_REG +`define RA_EP3_TX_FIFO_DATA_REG `EP3_TX_FIFO_BASE+`FIFO_DATA_REG +`define RA_EP3_TX_FIFO_STATUS_REG `EP3_TX_FIFO_BASE+`FIFO_STATUS_REG +`define RA_EP3_TX_FIFO_DATA_COUNT_MSB `EP3_TX_FIFO_BASE+`FIFO_DATA_COUNT_MSB +`define RA_EP3_TX_FIFO_DATA_COUNT_LSB `EP3_TX_FIFO_BASE+`FIFO_DATA_COUNT_LSB +`define RA_EP3_TX_FIFO_CONTROL_REG `EP3_TX_FIFO_BASE+`FIFO_CONTROL_REG + +`define RA_HOST_SLAVE_MODE `HOST_SLAVE_CONTROL_BASE+`HOST_SLAVE_CONTROL_REG +`define RA_HOST_SLAVE_VERSION `HOST_SLAVE_CONTROL_BASE+`HOST_SLAVE_VERSION_REG + + Index: Actel/usbDeviceActelTop/hdl/usbConstants_h.v =================================================================== --- Actel/usbDeviceActelTop/hdl/usbConstants_h.v (nonexistent) +++ Actel/usbDeviceActelTop/hdl/usbConstants_h.v (revision 40) @@ -0,0 +1,32 @@ +////////////////////////////////////////////////////////////////////// +//// usbConstants_h.v +/////////////////////////////////////////////////////////////////////// + +`ifdef usbConstants_h_vdefined +`else +`define usbConstants_h_vdefined + +//PIDTypes +`define OUT 4'h1 +`define IN 4'h9 +`define SOF 4'h5 +`define SETUP 4'hd +`define DATA0 4'h3 +`define DATA1 4'hb +`define ACK 4'h2 +`define NAK 4'ha +`define STALL 4'he +`define PREAMBLE 4'hc + + +//PIDGroups +`define SPECIAL 2'b00 +`define TOKEN 2'b01 +`define HANDSHAKE 2'b10 +`define DATA 2'b11 + +// start of packet SyncByte +`define SYNC_BYTE 8'h80 + +`endif //usbConstants_h_vdefined + Index: Actel/usbDeviceActelTop/hdl/usbHostControl_h.v =================================================================== --- Actel/usbDeviceActelTop/hdl/usbHostControl_h.v (nonexistent) +++ Actel/usbDeviceActelTop/hdl/usbHostControl_h.v (revision 40) @@ -0,0 +1,75 @@ +////////////////////////////////////////////////////////////////////// +// usbHostControl_h.v +////////////////////////////////////////////////////////////////////// + +`ifdef usbHostControl_h_vdefined +`else +`define usbHostControl_h_vdefined + +//HCRegIndices +`define TX_CONTROL_REG 4'h0 +`define TX_TRANS_TYPE_REG 4'h1 +`define TX_LINE_CONTROL_REG 4'h2 +`define TX_SOF_ENABLE_REG 4'h3 +`define TX_ADDR_REG 4'h4 +`define TX_ENDP_REG 4'h5 +`define FRAME_NUM_MSB_REG 4'h6 +`define FRAME_NUM_LSB_REG 4'h7 +`define INTERRUPT_STATUS_REG 4'h8 +`define INTERRUPT_MASK_REG 4'h9 +`define RX_STATUS_REG 4'ha +`define RX_PID_REG 4'hb +`define RX_ADDR_REG 4'hc +`define RX_ENDP_REG 4'hd +`define RX_CONNECT_STATE_REG 4'he +`define HOST_SOF_TIMER_MSB_REG 4'hf + +`define HCREG_BUFFER_LEN 4'hf +`define HCREG_MASK 4'hf + +//TXControlRegIndices +`define TRANS_REQ_BIT 0 +`define SOF_SYNC_BIT 1 +`define PREAMBLE_ENABLE_BIT 2 +`define ISO_ENABLE_BIT 3 + +//interruptRegIndices +`define TRANS_DONE_BIT 0 +`define RESUME_INT_BIT 1 +`define CONNECTION_EVENT_BIT 2 +`define SOF_SENT_BIT 3 + +//TXTransactionTypes +`define SETUP_TRANS 0 +`define IN_TRANS 1 +`define OUTDATA0_TRANS 2 +`define OUTDATA1_TRANS 3 + + //TXLineControlIndices +`define TX_LINE_STATE_LSBIT 0 +`define TX_LINE_STATE_MSBIT 1 +`define DIRECT_CONTROL_BIT 2 +`define FULL_SPEED_LINE_POLARITY_BIT 3 +`define FULL_SPEED_LINE_RATE_BIT 4 + +//TXSOFEnableIndices +`define SOF_EN_BIT 0 + +//SOFTimeConstants +//`define SOF_TX_TIME 80 //Fix this. Need correct SOF TX interval +//Note that 'SOF_TX_TIME' is 48000 - 3. This is to account for the delay in resetting the SOF timer +`define SOF_TX_TIME 16'hbb7d //Correct SOF interval for 48MHz clock. +//`define SOF_TX_MARGIN 2 +`define SOF_TX_MARGIN 16'h0190 //This is the transmission time for 100 bytes. May need to tweak + +//Host RXStatusRegIndices +`define HC_CRC_ERROR_BIT 0 +`define HC_BIT_STUFF_ERROR_BIT 1 +`define HC_RX_OVERFLOW_BIT 2 +`define HC_RX_TIME_OUT_BIT 3 +`define HC_NAK_RXED_BIT 4 +`define HC_STALL_RXED_BIT 5 +`define HC_ACK_RXED_BIT 6 +`define HC_DATA_SEQUENCE_BIT 7 + +`endif //usbHostControl_h_vdefined Index: Actel/usbDeviceActelTop/hdl/updateCRC5.v =================================================================== --- Actel/usbDeviceActelTop/hdl/updateCRC5.v (nonexistent) +++ Actel/usbDeviceActelTop/hdl/updateCRC5.v (revision 40) @@ -0,0 +1,112 @@ +////////////////////////////////////////////////////////////////////// +//// //// +//// updateCRC5.v //// +//// //// +//// This file is part of the usbhostslave opencores effort. +//// //// +//// //// +//// Module Description: //// +//// +//// //// +//// To Do: //// +//// +//// //// +//// Author(s): //// +//// - Steve Fielding, sfielding@base2designs.com //// +//// //// +////////////////////////////////////////////////////////////////////// +//// //// +//// Copyright (C) 2004 Steve Fielding and OPENCORES.ORG //// +//// //// +//// This source file may be used and distributed without //// +//// restriction provided that this copyright statement is not //// +//// removed from the file and that any derivative work contains //// +//// the original copyright notice and the associated disclaimer. //// +//// //// +//// This source file is free software; you can redistribute it //// +//// and/or modify it under the terms of the GNU Lesser General //// +//// Public License as published by the Free Software Foundation; //// +//// either version 2.1 of the License, or (at your option) any //// +//// later version. //// +//// //// +//// This source is distributed in the hope that it will be //// +//// useful, but WITHOUT ANY WARRANTY; without even the implied //// +//// warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR //// +//// PURPOSE. See the GNU Lesser General Public License for more //// +//// details. //// +//// //// +//// You should have received a copy of the GNU Lesser General //// +//// Public License along with this source; if not, download it //// +//// from //// +//// //// +////////////////////////////////////////////////////////////////////// +// +`include "timescale.v" + +module updateCRC5 (rstCRC, CRCResult, CRCEn, CRC5_8BitIn, dataIn, ready, clk, rst); +input rstCRC; +input CRCEn; +input CRC5_8BitIn; +input [7:0] dataIn; +input clk; +input rst; +output [4:0] CRCResult; +output ready; + +wire rstCRC; +wire CRCEn; +wire CRC5_8BitIn; +wire [7:0] dataIn; +wire clk; +wire rst; +reg [4:0] CRCResult; +reg ready; + +reg doUpdateCRC; +reg [7:0] data; +reg [3:0] loopEnd; +reg [3:0] i; + +always @(posedge clk) +begin + if (rst == 1'b1 || rstCRC == 1'b1) begin + doUpdateCRC <= 1'b0; + i <= 4'h0; + CRCResult <= 5'h1f; + ready <= 1'b1; + end + else + begin + if (doUpdateCRC == 1'b0) begin + if (CRCEn == 1'b1) begin + ready <= 1'b0; + doUpdateCRC <= 1'b1; + data <= dataIn; + if (CRC5_8BitIn == 1'b1) begin + loopEnd <= 4'h7; + end + else begin + loopEnd <= 4'h2; + end + end + end + else begin + i <= i + 1'b1; + if ( (CRCResult[0] ^ data[0]) == 1'b1) begin + CRCResult <= {1'b0, CRCResult[4:1]} ^ 5'h14; + end + else begin + CRCResult <= {1'b0, CRCResult[4:1]}; + end + data <= {1'b0, data[7:1]}; + if (i == loopEnd) begin + doUpdateCRC <= 1'b0; + i <= 4'h0; + ready <= 1'b1; + end + end + end +end + + +endmodule Index: Actel/usbDeviceActelTop/hdl/sctxportarbiter.v =================================================================== --- Actel/usbDeviceActelTop/hdl/sctxportarbiter.v (nonexistent) +++ Actel/usbDeviceActelTop/hdl/sctxportarbiter.v (revision 40) @@ -0,0 +1,202 @@ + +// File : ../RTL/slaveController/sctxportarbiter.v +// Generated : 11/10/06 05:37:24 +// From : ../RTL/slaveController/sctxportarbiter.asf +// By : FSM2VHDL ver. 5.0.0.9 + +////////////////////////////////////////////////////////////////////// +//// //// +//// SCTxPortArbiter +//// //// +//// This file is part of the usbhostslave opencores effort. +//// http://www.opencores.org/cores/usbhostslave/ //// +//// //// +//// Module Description: //// +//// +//// //// +//// To Do: //// +//// +//// //// +//// Author(s): //// +//// - Steve Fielding, sfielding@base2designs.com //// +//// //// +////////////////////////////////////////////////////////////////////// +//// //// +//// Copyright (C) 2004 Steve Fielding and OPENCORES.ORG //// +//// //// +//// This source file may be used and distributed without //// +//// restriction provided that this copyright statement is not //// +//// removed from the file and that any derivative work contains //// +//// the original copyright notice and the associated disclaimer. //// +//// //// +//// This source file is free software; you can redistribute it //// +//// and/or modify it under the terms of the GNU Lesser General //// +//// Public License as published by the Free Software Foundation; //// +//// either version 2.1 of the License, or (at your option) any //// +//// later version. //// +//// //// +//// This source is distributed in the hope that it will be //// +//// useful, but WITHOUT ANY WARRANTY; without even the implied //// +//// warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR //// +//// PURPOSE. See the GNU Lesser General Public License for more //// +//// details. //// +//// //// +//// You should have received a copy of the GNU Lesser General //// +//// Public License along with this source; if not, download it //// +//// from http://www.opencores.org/lgpl.shtml //// +//// //// +////////////////////////////////////////////////////////////////////// +// +`include "timescale.v" + +module SCTxPortArbiter (SCTxPortCntl, SCTxPortData, SCTxPortRdyIn, SCTxPortRdyOut, SCTxPortWEnable, clk, directCntlCntl, directCntlData, directCntlGnt, directCntlReq, directCntlWEn, rst, sendPacketCntl, sendPacketData, sendPacketGnt, sendPacketReq, sendPacketWEn); +input SCTxPortRdyIn; +input clk; +input [7:0] directCntlCntl; +input [7:0] directCntlData; +input directCntlReq; +input directCntlWEn; +input rst; +input [7:0] sendPacketCntl; +input [7:0] sendPacketData; +input sendPacketReq; +input sendPacketWEn; +output [7:0] SCTxPortCntl; +output [7:0] SCTxPortData; +output SCTxPortRdyOut; +output SCTxPortWEnable; +output directCntlGnt; +output sendPacketGnt; + +reg [7:0] SCTxPortCntl, next_SCTxPortCntl; +reg [7:0] SCTxPortData, next_SCTxPortData; +wire SCTxPortRdyIn; +reg SCTxPortRdyOut, next_SCTxPortRdyOut; +reg SCTxPortWEnable, next_SCTxPortWEnable; +wire clk; +wire [7:0] directCntlCntl; +wire [7:0] directCntlData; +reg directCntlGnt, next_directCntlGnt; +wire directCntlReq; +wire directCntlWEn; +wire rst; +wire [7:0] sendPacketCntl; +wire [7:0] sendPacketData; +reg sendPacketGnt, next_sendPacketGnt; +wire sendPacketReq; +wire sendPacketWEn; + +// diagram signals declarations +reg muxDCEn, next_muxDCEn; + +// BINARY ENCODED state machine: SCTxArb +// State codes definitions: +`define SARB1_WAIT_REQ 2'b00 +`define SARB_SEND_PACKET 2'b01 +`define SARB_DC 2'b10 +`define START_SARB 2'b11 + +reg [1:0] CurrState_SCTxArb; +reg [1:0] NextState_SCTxArb; + +// Diagram actions (continuous assignments allowed only: assign ...) + +// SOFController/directContol/sendPacket mux +always @(SCTxPortRdyIn) +begin + SCTxPortRdyOut <= SCTxPortRdyIn; +end +always @(muxDCEn or + directCntlWEn or directCntlData or directCntlCntl or + directCntlWEn or directCntlData or directCntlCntl or + sendPacketWEn or sendPacketData or sendPacketCntl) +begin +if (muxDCEn == 1'b1) + begin + SCTxPortWEnable <= directCntlWEn; + SCTxPortData <= directCntlData; + SCTxPortCntl <= directCntlCntl; + end +else + begin + SCTxPortWEnable <= sendPacketWEn; + SCTxPortData <= sendPacketData; + SCTxPortCntl <= sendPacketCntl; + end +end + +//-------------------------------------------------------------------- +// Machine: SCTxArb +//-------------------------------------------------------------------- +//---------------------------------- +// Next State Logic (combinatorial) +//---------------------------------- +always @ (sendPacketReq or directCntlReq or sendPacketGnt or muxDCEn or directCntlGnt or CurrState_SCTxArb) +begin : SCTxArb_NextState + NextState_SCTxArb <= CurrState_SCTxArb; + // Set default values for outputs and signals + next_sendPacketGnt <= sendPacketGnt; + next_muxDCEn <= muxDCEn; + next_directCntlGnt <= directCntlGnt; + case (CurrState_SCTxArb) + `SARB1_WAIT_REQ: + if (sendPacketReq == 1'b1) + begin + NextState_SCTxArb <= `SARB_SEND_PACKET; + next_sendPacketGnt <= 1'b1; + next_muxDCEn <= 1'b0; + end + else if (directCntlReq == 1'b1) + begin + NextState_SCTxArb <= `SARB_DC; + next_directCntlGnt <= 1'b1; + next_muxDCEn <= 1'b1; + end + `SARB_SEND_PACKET: + if (sendPacketReq == 1'b0) + begin + NextState_SCTxArb <= `SARB1_WAIT_REQ; + next_sendPacketGnt <= 1'b0; + end + `SARB_DC: + if (directCntlReq == 1'b0) + begin + NextState_SCTxArb <= `SARB1_WAIT_REQ; + next_directCntlGnt <= 1'b0; + end + `START_SARB: + NextState_SCTxArb <= `SARB1_WAIT_REQ; + endcase +end + +//---------------------------------- +// Current State Logic (sequential) +//---------------------------------- +always @ (posedge clk) +begin : SCTxArb_CurrentState + if (rst) + CurrState_SCTxArb <= `START_SARB; + else + CurrState_SCTxArb <= NextState_SCTxArb; +end + +//---------------------------------- +// Registered outputs logic +//---------------------------------- +always @ (posedge clk) +begin : SCTxArb_RegOutput + if (rst) + begin + muxDCEn <= 1'b0; + sendPacketGnt <= 1'b0; + directCntlGnt <= 1'b0; + end + else + begin + muxDCEn <= next_muxDCEn; + sendPacketGnt <= next_sendPacketGnt; + directCntlGnt <= next_directCntlGnt; + end +end + +endmodule \ No newline at end of file Index: Actel/usbDeviceActelTop/hdl/usbSerialInterfaceEngine.v =================================================================== --- Actel/usbDeviceActelTop/hdl/usbSerialInterfaceEngine.v (nonexistent) +++ Actel/usbDeviceActelTop/hdl/usbSerialInterfaceEngine.v (revision 40) @@ -0,0 +1,394 @@ +////////////////////////////////////////////////////////////////////// +//// //// +//// usbSerialInterfaceEngine.v //// +//// //// +//// This file is part of the usbhostslave opencores effort. +//// //// +//// //// +//// Module Description: //// +//// +//// //// +//// To Do: //// +//// +//// //// +//// Author(s): //// +//// - Steve Fielding, sfielding@base2designs.com //// +//// //// +////////////////////////////////////////////////////////////////////// +//// //// +//// Copyright (C) 2004 Steve Fielding and OPENCORES.ORG //// +//// //// +//// This source file may be used and distributed without //// +//// restriction provided that this copyright statement is not //// +//// removed from the file and that any derivative work contains //// +//// the original copyright notice and the associated disclaimer. //// +//// //// +//// This source file is free software; you can redistribute it //// +//// and/or modify it under the terms of the GNU Lesser General //// +//// Public License as published by the Free Software Foundation; //// +//// either version 2.1 of the License, or (at your option) any //// +//// later version. //// +//// //// +//// This source is distributed in the hope that it will be //// +//// useful, but WITHOUT ANY WARRANTY; without even the implied //// +//// warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR //// +//// PURPOSE. See the GNU Lesser General Public License for more //// +//// details. //// +//// //// +//// You should have received a copy of the GNU Lesser General //// +//// Public License along with this source; if not, download it //// +//// from //// +//// //// +////////////////////////////////////////////////////////////////////// +// +`include "timescale.v" + +module usbSerialInterfaceEngine( + clk, rst, + //readUSBWireData + USBWireDataIn, + USBWireDataInTick, + //writeUSBWireData + USBWireDataOut, + USBWireCtrlOut, + USBWireDataOutTick, + //SIEReceiver + connectState, + //processRxBit + resumeDetected, + //processRxByte + RxCtrlOut, + RxDataOutWEn, + RxDataOut, + //SIETransmitter + SIEPortCtrlIn, + SIEPortDataIn, + SIEPortTxRdy, + SIEPortWEn, + //lineControlUpdate + fullSpeedPolarity, + fullSpeedBitRate, + noActivityTimeOut, + noActivityTimeOutEnable +); + +input clk, rst; +//readUSBWireData +input [1:0] USBWireDataIn; +output USBWireDataInTick; +output noActivityTimeOut; +input noActivityTimeOutEnable; + +//writeUSBWireData +output [1:0] USBWireDataOut; +output USBWireCtrlOut; +output USBWireDataOutTick; + +//SIEReceiver +output [1:0] connectState; +//processRxBit +output resumeDetected; +//processRxByte +output [7:0] RxCtrlOut; +output RxDataOutWEn; +output [7:0] RxDataOut; +//SIETransmitter +input [7:0] SIEPortCtrlIn; +input [7:0] SIEPortDataIn; +output SIEPortTxRdy; +input SIEPortWEn; +//lineControlUpdate +input fullSpeedPolarity; +input fullSpeedBitRate; + +wire clk, rst; +//readUSBWireData +wire [1:0] USBWireDataIn; +wire USBWireDataInTick; +//writeUSBWireData +wire [1:0] USBWireDataOut; +wire USBWireCtrlOut; +wire noActivityTimeOut; +wire USBWireDataOutTick; +//SIEReceiver +wire [1:0] connectState; +//processRxBit +wire resumeDetected; +//processRxByte +wire [7:0] RxCtrlOut; +wire RxDataOutWEn; +wire [7:0] RxDataOut; +//SIETransmitter +wire [7:0] SIEPortCtrlIn; +wire [7:0] SIEPortDataIn; +wire SIEPortTxRdy; +wire SIEPortWEn; +//lineControlUpdate +wire fullSpeedPolarity; +wire fullSpeedBitRate; + +//internal wiring +wire processRxBitsWEn; +wire processRxBitRdy; +wire [1:0] RxWireDataFromWireRx; +wire RxWireDataWEn; +wire TxWireActiveDrive; +wire [1:0] TxBitsFromArbToWire; +wire TxCtrlFromArbToWire; +wire USBWireRdy; +wire USBWireWEn; +wire USBWireReadyFromTxArb; +wire prcTxByteCtrl; +wire [1:0] prcTxByteData; +wire prcTxByteGnt; +wire prcTxByteReq; +wire prcTxByteWEn; +wire SIETxCtrl; +wire [1:0] SIETxData; +wire SIETxGnt; +wire SIETxReq; +wire SIETxWEn; +wire [7:0] TxByteFromSIEToPrcTxByte; +wire [7:0] TxCtrlFromSIEToPrcTxByte; +wire [1:0] JBit; +wire [1:0] KBit; +wire processRxByteWEn; +wire [7:0] RxDataFromPrcRxBitToPrcRxByte; +wire [7:0] RxCtrlFromPrcRxBitToPrcRxByte; +wire processRxByteRdy; +//Rx CRC +wire RxCRC16En; +wire [15:0] RxCRC16Result; +wire RxCRC16UpdateRdy; +wire RxCRC5En; +wire [4:0] RxCRC5Result; +wire RxCRC5_8Bit; +wire [7:0] RxCRCData; +wire RxRstCRC; +wire RxCRC5UpdateRdy; +//Tx CRC +wire TxCRC16En; +wire [15:0] TxCRC16Result; +wire TxCRC16UpdateRdy; +wire TxCRC5En; +wire [4:0] TxCRC5Result; +wire TxCRC5_8Bit; +wire [7:0] TxCRCData; +wire TxRstCRC; +wire TxCRC5UpdateRdy; + +wire processTxByteRdy; +wire processTxByteWEn; + +wire SIEFsRate; +wire TxFSRateFromSIETxToPrcTxByte; +wire prcTxByteFSRate; +wire FSRateFromArbiterToWire; + +wire RxWireActive; + +lineControlUpdate u_lineControlUpdate + (.fullSpeedPolarity(fullSpeedPolarity), + .fullSpeedBitRate(fullSpeedBitRate), + .JBit(JBit), + .KBit(KBit) ); + +SIEReceiver u_SIEReceiver + ( + .RxWireDataIn(RxWireDataFromWireRx), + .RxWireDataWEn(RxWireDataWEn), + .clk(clk), + .connectState(connectState), + .rst(rst) ); + + +processRxBit u_processRxBit + (.JBit(JBit), + .KBit(KBit), + .RxBitsIn(RxWireDataFromWireRx), + .RxCtrlOut(RxCtrlFromPrcRxBitToPrcRxByte), + .RxDataOut(RxDataFromPrcRxBitToPrcRxByte), + .clk(clk), + .processRxBitRdy(processRxBitRdy), + .processRxBitsWEn(RxWireDataWEn), + .processRxByteWEn(processRxByteWEn), + .resumeDetected(resumeDetected), + .rst(rst), + .processRxByteRdy(processRxByteRdy), + .RxWireActive(RxWireActive) + ); + +processRxByte u_processRxByte + (.CRC16En(RxCRC16En), + .CRC16Result(RxCRC16Result), + .CRC16UpdateRdy(RxCRC16UpdateRdy), + .CRC5En(RxCRC5En), + .CRC5Result(RxCRC5Result), + .CRC5_8Bit(RxCRC5_8Bit), + .CRC5UpdateRdy(RxCRC5UpdateRdy), + .CRCData(RxCRCData), + .RxByteIn(RxDataFromPrcRxBitToPrcRxByte), + .RxCtrlIn(RxCtrlFromPrcRxBitToPrcRxByte), + .RxCtrlOut(RxCtrlOut), + .RxDataOutWEn(RxDataOutWEn), + .RxDataOut(RxDataOut), + .clk(clk), + .processRxDataInWEn(processRxByteWEn), + .rst(rst), + .rstCRC(RxRstCRC), + .processRxByteRdy(processRxByteRdy) ); + + +updateCRC5 RxUpdateCRC5 + (.rstCRC(RxRstCRC), + .CRCResult(RxCRC5Result), + .CRCEn(RxCRC5En), + .CRC5_8BitIn(RxCRC5_8Bit), + .dataIn(RxCRCData), + .ready(RxCRC5UpdateRdy), + .clk(clk), + .rst(rst) ); + +updateCRC16 RxUpdateCRC16 + (.rstCRC(RxRstCRC), + .CRCResult(RxCRC16Result), + .CRCEn(RxCRC16En), + .dataIn(RxCRCData), + .ready(RxCRC16UpdateRdy), + .clk(clk), + .rst(rst) ); + +SIETransmitter u_SIETransmitter + (.CRC16En(TxCRC16En), + .CRC16Result(TxCRC16Result), + .CRC5En(TxCRC5En), + .CRC5Result(TxCRC5Result), + .CRC5_8Bit(TxCRC5_8Bit), + .CRCData(TxCRCData), + .CRC5UpdateRdy(TxCRC5UpdateRdy), + .CRC16UpdateRdy(TxCRC16UpdateRdy), + .JBit(JBit), + .KBit(KBit), + .SIEPortCtrlIn(SIEPortCtrlIn), + .SIEPortDataIn(SIEPortDataIn), + .SIEPortTxRdy(SIEPortTxRdy), + .SIEPortWEn(SIEPortWEn), + .TxByteOutCtrl(TxCtrlFromSIEToPrcTxByte), + .TxByteOut(TxByteFromSIEToPrcTxByte), + .USBWireCtrl(SIETxCtrl), + .USBWireData(SIETxData), + .USBWireGnt(SIETxGnt), + .USBWireRdy(USBWireReadyFromTxArb), + .USBWireReq(SIETxReq), + .USBWireWEn(SIETxWEn), + .clk(clk), + .processTxByteRdy(processTxByteRdy), + .processTxByteWEn(processTxByteWEn), + .rst(rst), + .rstCRC(TxRstCRC), + .USBWireFullSpeedRate(SIEFsRate), + .TxByteOutFullSpeedRate(TxFSRateFromSIETxToPrcTxByte), + .fullSpeedRateIn(fullSpeedBitRate) + ); + +updateCRC5 TxUpdateCRC5 + (.rstCRC(TxRstCRC), + .CRCResult(TxCRC5Result), + .CRCEn(TxCRC5En), + .CRC5_8BitIn(TxCRC5_8Bit), + .dataIn(TxCRCData), + .ready(TxCRC5UpdateRdy), + .clk(clk), + .rst(rst) ); + +updateCRC16 TxUpdateCRC16 + (.rstCRC(TxRstCRC), + .CRCResult(TxCRC16Result), + .CRCEn(TxCRC16En), + .dataIn(TxCRCData), + .ready(TxCRC16UpdateRdy), + .clk(clk), + .rst(rst) ); + +processTxByte u_processTxByte + (.JBit(JBit), + .KBit(KBit), + .TxByteCtrlIn(TxCtrlFromSIEToPrcTxByte), + .TxByteIn(TxByteFromSIEToPrcTxByte), + .USBWireCtrl(prcTxByteCtrl), + .USBWireData(prcTxByteData), + .USBWireGnt(prcTxByteGnt), + .USBWireRdy(USBWireReadyFromTxArb), + .USBWireReq(prcTxByteReq), + .USBWireWEn(prcTxByteWEn), + .clk(clk), + .processTxByteRdy(processTxByteRdy), + .processTxByteWEn(processTxByteWEn), + .rst(rst), + .USBWireFullSpeedRate(prcTxByteFSRate), + .TxByteFullSpeedRateIn(TxFSRateFromSIETxToPrcTxByte) + ); + +USBTxWireArbiter u_USBTxWireArbiter + (.SIETxCtrl(SIETxCtrl), + .SIETxData(SIETxData), + .SIETxGnt(SIETxGnt), + .SIETxReq(SIETxReq), + .SIETxWEn(SIETxWEn), + .TxBits(TxBitsFromArbToWire), + .TxCtl(TxCtrlFromArbToWire), + .USBWireRdyIn(USBWireRdy), + .USBWireRdyOut(USBWireReadyFromTxArb), + .USBWireWEn(USBWireWEn), + .clk(clk), + .prcTxByteCtrl(prcTxByteCtrl), + .prcTxByteData(prcTxByteData), + .prcTxByteGnt(prcTxByteGnt), + .prcTxByteReq(prcTxByteReq), + .prcTxByteWEn(prcTxByteWEn), + .rst(rst), + .SIETxFSRate(SIEFsRate), + .prcTxByteFSRate(prcTxByteFSRate), + .TxFSRate(FSRateFromArbiterToWire) + ); + +writeUSBWireData u_writeUSBWireData + (.TxBitsIn(TxBitsFromArbToWire), + .TxBitsOut(USBWireDataOut), + .TxDataOutTick(USBWireDataOutTick), + .TxCtrlIn(TxCtrlFromArbToWire), + .TxCtrlOut(USBWireCtrlOut), + .USBWireRdy(USBWireRdy), + .USBWireWEn(USBWireWEn), + .TxWireActiveDrive(TxWireActiveDrive), + .fullSpeedRate(FSRateFromArbiterToWire), + .clk(clk), + .rst(rst) + ); + + + +readUSBWireData u_readUSBWireData + (.RxBitsIn(USBWireDataIn), + .RxDataInTick(USBWireDataInTick), + .RxBitsOut(RxWireDataFromWireRx), + .SIERxRdyIn(processRxBitRdy), + .SIERxWEn(RxWireDataWEn), + .fullSpeedRate(fullSpeedBitRate), + .TxWireActiveDrive(TxWireActiveDrive), + .clk(clk), + .rst(rst), + .noActivityTimeOut(noActivityTimeOut), + .RxWireActive(RxWireActive), + .noActivityTimeOutEnable(noActivityTimeOutEnable) + ); + + +endmodule + + + + + + + Index: Actel/usbDeviceActelTop/hdl/slaveRxStatusMonitor.v =================================================================== --- Actel/usbDeviceActelTop/hdl/slaveRxStatusMonitor.v (nonexistent) +++ Actel/usbDeviceActelTop/hdl/slaveRxStatusMonitor.v (revision 40) @@ -0,0 +1,95 @@ +////////////////////////////////////////////////////////////////////// +//// //// +//// slaveRxStatusMonitor.v //// +//// //// +//// This file is part of the usbhostslave opencores effort. +//// //// +//// //// +//// Module Description: //// +//// +//// //// +//// To Do: //// +//// +//// //// +//// Author(s): //// +//// - Steve Fielding, sfielding@base2designs.com //// +//// //// +////////////////////////////////////////////////////////////////////// +//// //// +//// Copyright (C) 2004 Steve Fielding and OPENCORES.ORG //// +//// //// +//// This source file may be used and distributed without //// +//// restriction provided that this copyright statement is not //// +//// removed from the file and that any derivative work contains //// +//// the original copyright notice and the associated disclaimer. //// +//// //// +//// This source file is free software; you can redistribute it //// +//// and/or modify it under the terms of the GNU Lesser General //// +//// Public License as published by the Free Software Foundation; //// +//// either version 2.1 of the License, or (at your option) any //// +//// later version. //// +//// //// +//// This source is distributed in the hope that it will be //// +//// useful, but WITHOUT ANY WARRANTY; without even the implied //// +//// warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR //// +//// PURPOSE. See the GNU Lesser General Public License for more //// +//// details. //// +//// //// +//// You should have received a copy of the GNU Lesser General //// +//// Public License along with this source; if not, download it //// +//// from //// +//// //// +////////////////////////////////////////////////////////////////////// +// +`include "timescale.v" + +module slaveRxStatusMonitor(connectStateIn, connectStateOut, resumeDetectedIn, resetEventOut, resumeIntOut, clk, rst); + +input [1:0] connectStateIn; +input resumeDetectedIn; +input clk; +input rst; +output resetEventOut; +output [1:0] connectStateOut; +output resumeIntOut; + +wire [1:0] connectStateIn; +wire resumeDetectedIn; +reg resetEventOut; +reg [1:0] connectStateOut; +reg resumeIntOut; +wire clk; +wire rst; + +reg [1:0]oldConnectState; +reg oldResumeDetected; + +always @(connectStateIn) +begin + connectStateOut <= connectStateIn; +end + + +always @(posedge clk) +begin + if (rst == 1'b1) + begin + oldConnectState <= connectStateIn; + oldResumeDetected <= resumeDetectedIn; + end + else + begin + oldConnectState <= connectStateIn; + oldResumeDetected <= resumeDetectedIn; + if (oldConnectState != connectStateIn) + resetEventOut <= 1'b1; + else + resetEventOut <= 1'b0; + if (resumeDetectedIn == 1'b1 && oldResumeDetected == 1'b0) + resumeIntOut <= 1'b1; + else + resumeIntOut <= 1'b0; + end +end + +endmodule Index: Actel/usbDeviceActelTop/hdl/slaveGetpacket.v =================================================================== --- Actel/usbDeviceActelTop/hdl/slaveGetpacket.v (nonexistent) +++ Actel/usbDeviceActelTop/hdl/slaveGetpacket.v (revision 40) @@ -0,0 +1,357 @@ + +// File : ../RTL/slaveController/slaveGetpacket.v +// Generated : 11/10/06 05:37:25 +// From : ../RTL/slaveController/slaveGetpacket.asf +// By : FSM2VHDL ver. 5.0.0.9 + +////////////////////////////////////////////////////////////////////// +//// //// +//// slaveGetPacket +//// //// +//// This file is part of the usbhostslave opencores effort. +//// http://www.opencores.org/cores/usbhostslave/ //// +//// //// +//// Module Description: //// +//// +//// //// +//// To Do: //// +//// +//// //// +//// Author(s): //// +//// - Steve Fielding, sfielding@base2designs.com //// +//// //// +////////////////////////////////////////////////////////////////////// +//// //// +//// Copyright (C) 2004 Steve Fielding and OPENCORES.ORG //// +//// //// +//// This source file may be used and distributed without //// +//// restriction provided that this copyright statement is not //// +//// removed from the file and that any derivative work contains //// +//// the original copyright notice and the associated disclaimer. //// +//// //// +//// This source file is free software; you can redistribute it //// +//// and/or modify it under the terms of the GNU Lesser General //// +//// Public License as published by the Free Software Foundation; //// +//// either version 2.1 of the License, or (at your option) any //// +//// later version. //// +//// //// +//// This source is distributed in the hope that it will be //// +//// useful, but WITHOUT ANY WARRANTY; without even the implied //// +//// warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR //// +//// PURPOSE. See the GNU Lesser General Public License for more //// +//// details. //// +//// //// +//// You should have received a copy of the GNU Lesser General //// +//// Public License along with this source; if not, download it //// +//// from http://www.opencores.org/lgpl.shtml //// +//// //// +////////////////////////////////////////////////////////////////////// +// +`include "timescale.v" +`include "usbSerialInterfaceEngine_h.v" +`include "usbConstants_h.v" + +module slaveGetPacket (ACKRxed, CRCError, RXDataIn, RXDataValid, RXFifoData, RXFifoFull, RXFifoWEn, RXOverflow, RXPacketRdy, RXStreamStatusIn, RXTimeOut, RxPID, SIERxTimeOut, SIERxTimeOutEn, bitStuffError, clk, dataSequence, endPointReady, getPacketEn, rst); +input [7:0] RXDataIn; +input RXDataValid; +input RXFifoFull; +input [7:0] RXStreamStatusIn; +input SIERxTimeOut; // Single cycle pulse +input clk; +input endPointReady; +input getPacketEn; +input rst; +output ACKRxed; +output CRCError; +output [7:0] RXFifoData; +output RXFifoWEn; +output RXOverflow; +output RXPacketRdy; +output RXTimeOut; +output [3:0] RxPID; +output SIERxTimeOutEn; +output bitStuffError; +output dataSequence; + +reg ACKRxed, next_ACKRxed; +reg CRCError, next_CRCError; +wire [7:0] RXDataIn; +wire RXDataValid; +reg [7:0] RXFifoData, next_RXFifoData; +wire RXFifoFull; +reg RXFifoWEn, next_RXFifoWEn; +reg RXOverflow, next_RXOverflow; +reg RXPacketRdy, next_RXPacketRdy; +wire [7:0] RXStreamStatusIn; +reg RXTimeOut, next_RXTimeOut; +reg [3:0] RxPID, next_RxPID; +wire SIERxTimeOut; +reg SIERxTimeOutEn, next_SIERxTimeOutEn; +reg bitStuffError, next_bitStuffError; +wire clk; +reg dataSequence, next_dataSequence; +wire endPointReady; +wire getPacketEn; +wire rst; + +// diagram signals declarations +reg [7:0]RXByteOld, next_RXByteOld; +reg [7:0]RXByteOldest, next_RXByteOldest; +reg [7:0]RXByte, next_RXByte; +reg [7:0]RXStreamStatus, next_RXStreamStatus; + +// BINARY ENCODED state machine: slvGetPkt +// State codes definitions: +`define PROC_PKT_CHK_PID 5'b00000 +`define PROC_PKT_HS 5'b00001 +`define PROC_PKT_DATA_W_D1 5'b00010 +`define PROC_PKT_DATA_CHK_D1 5'b00011 +`define PROC_PKT_DATA_W_D2 5'b00100 +`define PROC_PKT_DATA_FIN 5'b00101 +`define PROC_PKT_DATA_CHK_D2 5'b00110 +`define PROC_PKT_DATA_W_D3 5'b00111 +`define PROC_PKT_DATA_CHK_D3 5'b01000 +`define PROC_PKT_DATA_LOOP_CHK_FIFO 5'b01001 +`define PROC_PKT_DATA_LOOP_FIFO_FULL 5'b01010 +`define PROC_PKT_DATA_LOOP_W_D 5'b01011 +`define START_GP 5'b01100 +`define WAIT_PKT 5'b01101 +`define CHK_PKT_START 5'b01110 +`define WAIT_EN 5'b01111 +`define PKT_RDY 5'b10000 +`define PROC_PKT_DATA_LOOP_DELAY 5'b10001 +`define PROC_PKT_DATA_LOOP_EP_N_RDY 5'b10010 + +reg [4:0] CurrState_slvGetPkt; +reg [4:0] NextState_slvGetPkt; + + +//-------------------------------------------------------------------- +// Machine: slvGetPkt +//-------------------------------------------------------------------- +//---------------------------------- +// Next State Logic (combinatorial) +//---------------------------------- +always @ (RXDataIn or RXStreamStatusIn or RXByte or RXByteOldest or RXByteOld or RXDataValid or SIERxTimeOut or RXStreamStatus or getPacketEn or endPointReady or RXFifoFull or CRCError or bitStuffError or RXOverflow or RXTimeOut or ACKRxed or dataSequence or SIERxTimeOutEn or RxPID or RXPacketRdy or RXFifoWEn or RXFifoData or CurrState_slvGetPkt) +begin : slvGetPkt_NextState + NextState_slvGetPkt <= CurrState_slvGetPkt; + // Set default values for outputs and signals + next_CRCError <= CRCError; + next_bitStuffError <= bitStuffError; + next_RXOverflow <= RXOverflow; + next_RXTimeOut <= RXTimeOut; + next_ACKRxed <= ACKRxed; + next_dataSequence <= dataSequence; + next_SIERxTimeOutEn <= SIERxTimeOutEn; + next_RXByte <= RXByte; + next_RXStreamStatus <= RXStreamStatus; + next_RxPID <= RxPID; + next_RXPacketRdy <= RXPacketRdy; + next_RXByteOldest <= RXByteOldest; + next_RXByteOld <= RXByteOld; + next_RXFifoWEn <= RXFifoWEn; + next_RXFifoData <= RXFifoData; + case (CurrState_slvGetPkt) + `START_GP: + NextState_slvGetPkt <= `WAIT_EN; + `WAIT_PKT: + begin + next_CRCError <= 1'b0; + next_bitStuffError <= 1'b0; + next_RXOverflow <= 1'b0; + next_RXTimeOut <= 1'b0; + next_ACKRxed <= 1'b0; + next_dataSequence <= 1'b0; + next_SIERxTimeOutEn <= 1'b1; + if (RXDataValid == 1'b1) + begin + NextState_slvGetPkt <= `CHK_PKT_START; + next_RXByte <= RXDataIn; + next_RXStreamStatus <= RXStreamStatusIn; + end + else if (SIERxTimeOut == 1'b1) + begin + NextState_slvGetPkt <= `PKT_RDY; + next_RXTimeOut <= 1'b1; + end + end + `CHK_PKT_START: + if (RXStreamStatus == `RX_PACKET_START) + begin + NextState_slvGetPkt <= `PROC_PKT_CHK_PID; + next_RxPID <= RXByte[3:0]; + end + else + begin + NextState_slvGetPkt <= `PKT_RDY; + next_RXTimeOut <= 1'b1; + end + `WAIT_EN: + begin + next_RXPacketRdy <= 1'b0; + next_SIERxTimeOutEn <= 1'b0; + if (getPacketEn == 1'b1) + NextState_slvGetPkt <= `WAIT_PKT; + end + `PKT_RDY: + begin + next_RXPacketRdy <= 1'b1; + NextState_slvGetPkt <= `WAIT_EN; + end + `PROC_PKT_CHK_PID: + if (RXByte[1:0] == `HANDSHAKE) + NextState_slvGetPkt <= `PROC_PKT_HS; + else if (RXByte[1:0] == `DATA) + NextState_slvGetPkt <= `PROC_PKT_DATA_W_D1; + else + NextState_slvGetPkt <= `PKT_RDY; + `PROC_PKT_HS: + if (RXDataValid == 1'b1) + begin + NextState_slvGetPkt <= `PKT_RDY; + next_RXOverflow <= RXDataIn[`RX_OVERFLOW_BIT]; + next_ACKRxed <= RXDataIn[`ACK_RXED_BIT]; + end + `PROC_PKT_DATA_W_D1: + if (RXDataValid == 1'b1) + begin + NextState_slvGetPkt <= `PROC_PKT_DATA_CHK_D1; + next_RXByte <= RXDataIn; + next_RXStreamStatus <= RXStreamStatusIn; + end + `PROC_PKT_DATA_CHK_D1: + if (RXStreamStatus == `RX_PACKET_STREAM) + begin + NextState_slvGetPkt <= `PROC_PKT_DATA_W_D2; + next_RXByteOldest <= RXByte; + end + else + NextState_slvGetPkt <= `PROC_PKT_DATA_FIN; + `PROC_PKT_DATA_W_D2: + if (RXDataValid == 1'b1) + begin + NextState_slvGetPkt <= `PROC_PKT_DATA_CHK_D2; + next_RXByte <= RXDataIn; + next_RXStreamStatus <= RXStreamStatusIn; + end + `PROC_PKT_DATA_FIN: + begin + next_CRCError <= RXByte[`CRC_ERROR_BIT]; + next_bitStuffError <= RXByte[`BIT_STUFF_ERROR_BIT]; + next_dataSequence <= RXByte[`DATA_SEQUENCE_BIT]; + NextState_slvGetPkt <= `PKT_RDY; + end + `PROC_PKT_DATA_CHK_D2: + if (RXStreamStatus == `RX_PACKET_STREAM) + begin + NextState_slvGetPkt <= `PROC_PKT_DATA_W_D3; + next_RXByteOld <= RXByte; + end + else + NextState_slvGetPkt <= `PROC_PKT_DATA_FIN; + `PROC_PKT_DATA_W_D3: + if (RXDataValid == 1'b1) + begin + NextState_slvGetPkt <= `PROC_PKT_DATA_CHK_D3; + next_RXByte <= RXDataIn; + next_RXStreamStatus <= RXStreamStatusIn; + end + `PROC_PKT_DATA_CHK_D3: + if (RXStreamStatus == `RX_PACKET_STREAM) + NextState_slvGetPkt <= `PROC_PKT_DATA_LOOP_CHK_FIFO; + else + NextState_slvGetPkt <= `PROC_PKT_DATA_FIN; + `PROC_PKT_DATA_LOOP_CHK_FIFO: + if (endPointReady == 1'b0) + NextState_slvGetPkt <= `PROC_PKT_DATA_LOOP_EP_N_RDY; + else if (RXFifoFull == 1'b1) + begin + NextState_slvGetPkt <= `PROC_PKT_DATA_LOOP_FIFO_FULL; + next_RXOverflow <= 1'b1; + end + else + begin + NextState_slvGetPkt <= `PROC_PKT_DATA_LOOP_W_D; + next_RXFifoWEn <= 1'b1; + next_RXFifoData <= RXByteOldest; + next_RXByteOldest <= RXByteOld; + next_RXByteOld <= RXByte; + end + `PROC_PKT_DATA_LOOP_FIFO_FULL: + NextState_slvGetPkt <= `PROC_PKT_DATA_LOOP_W_D; + `PROC_PKT_DATA_LOOP_W_D: + begin + next_RXFifoWEn <= 1'b0; + if ((RXDataValid == 1'b1) && (RXStreamStatusIn == `RX_PACKET_STREAM)) + begin + NextState_slvGetPkt <= `PROC_PKT_DATA_LOOP_DELAY; + next_RXByte <= RXDataIn; + end + else if (RXDataValid == 1'b1) + begin + NextState_slvGetPkt <= `PROC_PKT_DATA_FIN; + next_RXByte <= RXDataIn; + end + end + `PROC_PKT_DATA_LOOP_DELAY: + NextState_slvGetPkt <= `PROC_PKT_DATA_LOOP_CHK_FIFO; + `PROC_PKT_DATA_LOOP_EP_N_RDY: // Discard data + NextState_slvGetPkt <= `PROC_PKT_DATA_LOOP_W_D; + endcase +end + +//---------------------------------- +// Current State Logic (sequential) +//---------------------------------- +always @ (posedge clk) +begin : slvGetPkt_CurrentState + if (rst) + CurrState_slvGetPkt <= `START_GP; + else + CurrState_slvGetPkt <= NextState_slvGetPkt; +end + +//---------------------------------- +// Registered outputs logic +//---------------------------------- +always @ (posedge clk) +begin : slvGetPkt_RegOutput + if (rst) + begin + RXByteOld <= 8'h00; + RXByteOldest <= 8'h00; + RXByte <= 8'h00; + RXStreamStatus <= 8'h00; + RXPacketRdy <= 1'b0; + RXFifoWEn <= 1'b0; + RXFifoData <= 8'h00; + CRCError <= 1'b0; + bitStuffError <= 1'b0; + RXOverflow <= 1'b0; + RXTimeOut <= 1'b0; + ACKRxed <= 1'b0; + dataSequence <= 1'b0; + SIERxTimeOutEn <= 1'b0; + RxPID <= 4'h0; + end + else + begin + RXByteOld <= next_RXByteOld; + RXByteOldest <= next_RXByteOldest; + RXByte <= next_RXByte; + RXStreamStatus <= next_RXStreamStatus; + RXPacketRdy <= next_RXPacketRdy; + RXFifoWEn <= next_RXFifoWEn; + RXFifoData <= next_RXFifoData; + CRCError <= next_CRCError; + bitStuffError <= next_bitStuffError; + RXOverflow <= next_RXOverflow; + RXTimeOut <= next_RXTimeOut; + ACKRxed <= next_ACKRxed; + dataSequence <= next_dataSequence; + SIERxTimeOutEn <= next_SIERxTimeOutEn; + RxPID <= next_RxPID; + end +end + +endmodule \ No newline at end of file Index: Actel/usbDeviceActelTop/hdl/usbDeviceActelTop.v =================================================================== --- Actel/usbDeviceActelTop/hdl/usbDeviceActelTop.v (nonexistent) +++ Actel/usbDeviceActelTop/hdl/usbDeviceActelTop.v (revision 40) @@ -0,0 +1,88 @@ + +module usbDeviceActelTop ( + + // + // Global signals + // + clk, + rst_n, + + // eval board features + ledOut, + + // + // USB + // + usbSlaveVP, + usbSlaveVM, + usbSlaveOE_n, + usbDPlusPullup + +); + + // + // Global signals + // + input clk; + input rst_n; + + output [9:0] ledOut; + + // + // USB + // + inout usbSlaveVP; + inout usbSlaveVM; + output usbSlaveOE_n; + output usbDPlusPullup; + +//local wires and regs +reg [1:0] rstReg; +wire rst; + +//generate sync reset +always @(posedge clk) begin + rstReg[1:0] <= {rstReg[0], ~rst_n}; +end +assign rst = rstReg[1]; + + +usbDevice u_usbDevice ( + .clk(clk), + .rst(rst), + .usbSlaveVP_in(usbSlaveVP_in), + .usbSlaveVM_in(usbSlaveVM_in), + .usbSlaveVP_out(usbSlaveVP_out), + .usbSlaveVM_out(usbSlaveVM_out), + .usbSlaveOE_n(usbSlaveOE_n), + .usbDPlusPullup(usbDPlusPullup), + .vBusDetect(1'b1) +); + + +assign {usbSlaveVP_in, usbSlaveVM_in} = {usbSlaveVP, usbSlaveVM}; +assign {usbSlaveVP, usbSlaveVM} = (usbSlaveOE_n == 1'b0) ? {usbSlaveVP_out, usbSlaveVM_out} : 2'bzz; + + +// comfort lights +reg [9:0] ledCntReg; +reg [21:0] cnt; + +assign ledOut = ledCntReg; + + +always @(posedge clk) begin + if (rst == 1'b1) begin + ledCntReg <= 10'b00_0000_0000; + cnt <= {22{1'b0}}; + end + else begin + cnt <= cnt + 1'b1; + if (cnt == {22{1'b0}}) + ledCntReg <= ledCntReg + 1'b1; + end +end + +endmodule + + Index: Actel/usbDeviceActelTop/hdl/readUSBWireData.v =================================================================== --- Actel/usbDeviceActelTop/hdl/readUSBWireData.v (nonexistent) +++ Actel/usbDeviceActelTop/hdl/readUSBWireData.v (revision 40) @@ -0,0 +1,274 @@ +////////////////////////////////////////////////////////////////////// +//// //// +//// readUSBWireData.v //// +//// //// +//// This file is part of the usbhostslave opencores effort. +//// //// +//// //// +//// Module Description: //// +//// This module reads data from the differential USB data lines +//// and writes into a 4 entry FIFO. The data is read from +//// the fifo and output from the module when the higher level +//// state machine is ready to receive the data. +//// This module must recover the clock phase from the incoming +//// USB data. 'sampleCnt' is reset to zero whenever a RX data +//// edge is detected. Note that due to metastability the data +//// at the edge may not be registered correctly, but this does +//// not matter. All that matters is that an edge was detected. The +//// data will be accurately sampled in the middle of the USB bit +//// period without metastability issues. +//// After the edge detect, 'sampleCnt' is incremented at every clock +//// tick, and when it indicates the middle of a USB bit period +//// the RX data is sampled and written to the input buffer. +//// Single clock tick adjustments to 'sampleCnt' can be made at +//// every RX data edge detect without double sampling the incoming +//// data. However, the first RX data bit in a packet may cause +//// 'sampleCnt' to be adjusted by a value greater than a single +//// clock tick, and this can result in double sampling of the +//// first data bit a RX packet. This +//// double sampled data must be rejected by the higher level module. +//// This is achieved by +//// qualifying the outgoing data with 'RxWireActive'. Thus +//// the first data bit in a RX packet may be double sampled +//// as the clock recovery mechanism synchronizes to 'RxBitsIn' +//// but the double sampled data will be rejected by the higher +//// level module. +//// +//// //// +//// To Do: //// +//// +//// //// +//// Author(s): //// +//// - Steve Fielding, sfielding@base2designs.com //// +//// //// +////////////////////////////////////////////////////////////////////// +//// //// +//// Copyright (C) 2004 Steve Fielding and OPENCORES.ORG //// +//// //// +//// This source file may be used and distributed without //// +//// restriction provided that this copyright statement is not //// +//// removed from the file and that any derivative work contains //// +//// the original copyright notice and the associated disclaimer. //// +//// //// +//// This source file is free software; you can redistribute it //// +//// and/or modify it under the terms of the GNU Lesser General //// +//// Public License as published by the Free Software Foundation; //// +//// either version 2.1 of the License, or (at your option) any //// +//// later version. //// +//// //// +//// This source is distributed in the hope that it will be //// +//// useful, but WITHOUT ANY WARRANTY; without even the implied //// +//// warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR //// +//// PURPOSE. See the GNU Lesser General Public License for more //// +//// details. //// +//// //// +//// You should have received a copy of the GNU Lesser General //// +//// Public License along with this source; if not, download it //// +//// from //// +//// //// +////////////////////////////////////////////////////////////////////// +// +`include "timescale.v" +`include "usbSerialInterfaceEngine_h.v" + +module readUSBWireData (RxBitsIn, RxDataInTick, RxBitsOut, SIERxRdyIn, SIERxWEn, fullSpeedRate, TxWireActiveDrive, clk, rst, noActivityTimeOut, RxWireActive, noActivityTimeOutEnable); +input [1:0] RxBitsIn; +output RxDataInTick; +input SIERxRdyIn; +input clk; +input fullSpeedRate; +input rst; +input TxWireActiveDrive; +output [1:0] RxBitsOut; +output SIERxWEn; +output noActivityTimeOut; +output RxWireActive; +input noActivityTimeOutEnable; + +wire [1:0] RxBitsIn; +reg RxDataInTick; +wire SIERxRdyIn; +wire clk; +wire fullSpeedRate; +wire rst; +reg [1:0] RxBitsOut; +reg SIERxWEn; +reg noActivityTimeOut; +reg RxWireActive; +wire noActivityTimeOutEnable; + +// local registers +reg [2:0]buffer0; +reg [2:0]buffer1; +reg [2:0]buffer2; +reg [2:0]buffer3; +reg [2:0]bufferCnt; +reg [1:0]bufferInIndex; +reg [1:0]bufferOutIndex; +reg decBufferCnt; +reg [4:0]sampleCnt; +reg incBufferCnt; +reg [1:0]oldRxBitsIn; +reg [1:0] RxBitsInReg; +reg [15:0] timeOutCnt; +reg [7:0] rxActiveCnt; +reg RxWireEdgeDetect; +reg RxWireActiveReg; +reg RxWireActiveReg2; +reg [1:0] RxBitsInSyncReg1; +reg [1:0] RxBitsInSyncReg2; + +// buffer output state machine state codes: +`define WAIT_BUFFER_NOT_EMPTY 2'b00 +`define WAIT_SIE_RX_READY 2'b01 +`define SIE_RX_WRITE 2'b10 + +// re-synchronize incoming bits +always @(posedge clk) begin + RxBitsInSyncReg1 <= RxBitsIn; + RxBitsInSyncReg2 <= RxBitsInSyncReg1; +end + +reg [1:0] bufferOutStMachCurrState; + + +always @(posedge clk) begin + if (rst == 1'b1) + begin + bufferCnt <= 3'b000; + end + else begin + if (incBufferCnt == 1'b1 && decBufferCnt == 1'b0) + bufferCnt <= bufferCnt + 1'b1; + else if (incBufferCnt == 1'b0 && decBufferCnt == 1'b1) + bufferCnt <= bufferCnt - 1'b1; + end +end + + + +//Perform line rate clock recovery +//Recover the wire data, and store data to buffer +always @(posedge clk) begin + if (rst == 1'b1) + begin + sampleCnt <= 5'b00000; + incBufferCnt <= 1'b0; + bufferInIndex <= 2'b00; + buffer0 <= 3'b000; + buffer1 <= 3'b000; + buffer2 <= 3'b000; + buffer3 <= 3'b000; + RxDataInTick <= 1'b0; + RxWireEdgeDetect <= 1'b0; + RxWireActiveReg <= 1'b0; + RxWireActiveReg2 <= 1'b0; + end + else begin + RxWireActiveReg2 <= RxWireActiveReg; //Delay 'RxWireActiveReg' until after 'sampleCnt' has been reset + RxBitsInReg <= RxBitsInSyncReg2; + oldRxBitsIn <= RxBitsInReg; + incBufferCnt <= 1'b0; //default value + if ( (TxWireActiveDrive == 1'b0) && (RxBitsInSyncReg2 != RxBitsInReg)) begin //if edge detected then + sampleCnt <= 5'b00000; + RxWireEdgeDetect <= 1'b1; // flag receive activity + RxWireActiveReg <= 1'b1; + rxActiveCnt <= 8'h00; + end + else begin + sampleCnt <= sampleCnt + 1'b1; + RxWireEdgeDetect <= 1'b0; + rxActiveCnt <= rxActiveCnt + 1'b1; + //clear 'RxWireActiveReg' if no RX transitions for RX_EDGE_DET_TOUT USB bit periods + if ( (fullSpeedRate == 1'b1 && rxActiveCnt == `RX_EDGE_DET_TOUT * `FS_OVER_SAMPLE_RATE) + || (fullSpeedRate == 1'b0 && rxActiveCnt == `RX_EDGE_DET_TOUT * `LS_OVER_SAMPLE_RATE) ) + RxWireActiveReg <= 1'b0; + end + if ( (fullSpeedRate == 1'b1 && sampleCnt[1:0] == 2'b10) || (fullSpeedRate == 1'b0 && sampleCnt == 5'b10000) ) + begin + RxDataInTick <= !RxDataInTick; + if (TxWireActiveDrive != 1'b1) //do not read wire data when transmitter is active + begin + incBufferCnt <= 1'b1; + bufferInIndex <= bufferInIndex + 1'b1; + case (bufferInIndex) + 2'b00 : buffer0 <= {RxWireActiveReg2, oldRxBitsIn}; + 2'b01 : buffer1 <= {RxWireActiveReg2, oldRxBitsIn}; + 2'b10 : buffer2 <= {RxWireActiveReg2, oldRxBitsIn}; + 2'b11 : buffer3 <= {RxWireActiveReg2, oldRxBitsIn}; + endcase + end + end + end +end + + + +//read from buffer, and output to SIEReceiver +always @(posedge clk) begin + if (rst == 1'b1) + begin + decBufferCnt <= 1'b0; + bufferOutIndex <= 2'b00; + RxBitsOut <= 2'b00; + SIERxWEn <= 1'b0; + bufferOutStMachCurrState <= `WAIT_BUFFER_NOT_EMPTY; + end + else begin + case (bufferOutStMachCurrState) + `WAIT_BUFFER_NOT_EMPTY: + begin + if (bufferCnt != 3'b000) + bufferOutStMachCurrState <= `WAIT_SIE_RX_READY; + end + `WAIT_SIE_RX_READY: + begin + if (SIERxRdyIn == 1'b1) + begin + SIERxWEn <= 1'b1; + bufferOutStMachCurrState <= `SIE_RX_WRITE; + decBufferCnt <= 1'b1; + bufferOutIndex <= bufferOutIndex + 1'b1; + case (bufferOutIndex) + 2'b00 : begin RxBitsOut <= buffer0[1:0]; RxWireActive <= buffer0[2]; end + 2'b01 : begin RxBitsOut <= buffer1[1:0]; RxWireActive <= buffer1[2]; end + 2'b10 : begin RxBitsOut <= buffer2[1:0]; RxWireActive <= buffer2[2]; end + 2'b11 : begin RxBitsOut <= buffer3[1:0]; RxWireActive <= buffer3[2]; end + endcase + end + end + `SIE_RX_WRITE: + begin + SIERxWEn <= 1'b0; + decBufferCnt <= 1'b0; + bufferOutStMachCurrState <= `WAIT_BUFFER_NOT_EMPTY; + end + endcase + end +end + +//generate 'noActivityTimeOut' pulse if no tx or rx activity for RX_PACKET_TOUT USB bit periods +//'noActivityTimeOut' pulse can only be generated when the host or slave getPacket +//process enables via 'noActivityTimeOutEnable' signal +//'noActivityTimeOut' pulse is used by host and slave getPacket processes to determine if +//there has been a response time out. +always @(posedge clk) begin + if (rst) begin + timeOutCnt <= 16'h0000; + noActivityTimeOut <= 1'b0; + end + else begin + if (TxWireActiveDrive == 1'b1 || RxWireEdgeDetect == 1'b1 || noActivityTimeOutEnable == 1'b0) + timeOutCnt <= 16'h0000; + else + timeOutCnt <= timeOutCnt + 1'b1; + if ( (fullSpeedRate == 1'b1 && timeOutCnt == `RX_PACKET_TOUT * `FS_OVER_SAMPLE_RATE) + || (fullSpeedRate == 1'b0 && timeOutCnt == `RX_PACKET_TOUT * `LS_OVER_SAMPLE_RATE) ) + noActivityTimeOut <= 1'b1; + else + noActivityTimeOut <= 1'b0; + end +end + + +endmodule Index: Actel/usbDeviceActelTop/hdl/usbROM.v =================================================================== --- Actel/usbDeviceActelTop/hdl/usbROM.v (nonexistent) +++ Actel/usbDeviceActelTop/hdl/usbROM.v (revision 40) @@ -0,0 +1,254 @@ +////////////////////////////////////////////////////////////////////// +//// //// +//// usbROM.v //// +//// //// +//// This file is part of the usbHostSlave opencores effort. +//// //// +//// //// +//// Module Description: //// +//// if you modify this file, be sure to modify usbDevice_define.v +//// Using RAM rather than logic resources might be a more efficient implememtation +//// but this has the advantage of working with FPGAs that do not provide a +//// mechanism for initialising RAM, eg Actel IGLOO +//// Quartus 7.2 will infer this code as BLOCK RAM, and provide initialisation - nice +//// //// +//// To Do: //// +//// +//// //// +//// Author(s): //// +//// - Steve Fielding, sfielding@base2designs.com //// +//// //// +////////////////////////////////////////////////////////////////////// +//// //// +//// Copyright (C) 2008 Steve Fielding and OPENCORES.ORG //// +//// //// +//// This source file may be used and distributed without //// +//// restriction provided that this copyright statement is not //// +//// removed from the file and that any derivative work contains //// +//// the original copyright notice and the associated disclaimer. //// +//// //// +//// This source file is free software; you can redistribute it //// +//// and/or modify it under the terms of the GNU Lesser General //// +//// Public License as published by the Free Software Foundation; //// +//// either version 2.1 of the License, or (at your option) any //// +//// later version. //// +//// //// +//// This source is distributed in the hope that it will be //// +//// useful, but WITHOUT ANY WARRANTY; without even the implied //// +//// warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR //// +//// PURPOSE. See the GNU Lesser General Public License for more //// +//// details. //// +//// //// +//// You should have received a copy of the GNU Lesser General //// +//// Public License along with this source; if not, download it //// +//// from //// +//// //// +////////////////////////////////////////////////////////////////////// +// +`include "usbDevice_define.v" + + +module usbROM ( + clk, + addr, + data +); +input clk; +input [7:0] addr; +output [7:0] data; +reg [7:0] data; + +always @(posedge clk) begin + case (addr) +// ==================================== +// ===== DEVICE Descriptor ===== +// ==================================== + + 8'h00: data <= 8'h12; //BYTE bLength + 8'h01: data <= 8'h01; //BYTE bDescriptorType + 8'h02: data <= 8'h10; //WORD (Lo) bcdUSB version supported + 8'h03: data <= 8'h01; //WORD (Hi) bcdUSB version supported + 8'h04: data <= 8'h00; //BYTE bDeviceClass + 8'h05: data <= 8'h00; //BYTE bDeviceSubClass + 8'h06: data <= 8'h00; //BYTE bDeviceProtocol + 8'h07: data <= `MAX_RESP_SIZE; //BYTE bMaxPacketSize + 8'h08: data <= 8'hC7; //WORD (Lo) idVendor + 8'h09: data <= 8'h05; //WORD (Hi) idVendor + 8'h0a: data <= 8'h13; //WORD (Lo) idProduct; For Philips Hub mouse + 8'h0b: data <= 8'h01; //WORD (Hi) idProduct; For Philips Hub mouse + 8'h0c: data <= 8'h01; //WORD (Lo) bcdDevice + 8'h0d: data <= 8'h00; //WORD (Hi) bcdDevice + 8'h0e: data <= 8'h01; //BYTE iManufacturer + 8'h0f: data <= 8'h02; //BYTE iProduct + 8'h10: data <= 8'h03; //BYTE iSerialNumber + 8'h11: data <= 8'h01; //BYTE bNumConfigurations + + +// ==================================== +// ===== Configuration Descriptor ===== +// ==================================== + 8'h12: data <= 8'h09; //BYTE bLength (Configuration descriptor) + 8'h13: data <= 8'h02; //BYTE bDescriptorType //Assigned by USB + 8'h14: data <= 8'd34; //WORD (Lo) wTotalLength + 8'h15: data <= 8'h00; //WORD (Hi) wTotalLength + 8'h16: data <= 8'h01; //BYTE bNumInterfaces + 8'h17: data <= 8'h01; //BYTE bConfigurationValue + 8'h18: data <= 8'h00; //BYTE iConfiguration + 8'h19: data <= 8'ha0; //BYTE bmAttributes, Bus powered and remote wakeup + 8'h1a: data <= 8'h32; //BYTE MaxPower, 100mA + +// ==================================== +// ===== Interface Descriptor ===== +// ==================================== + 8'h1b: data <= 8'h09; //BYTE bLength (Interface descriptor) + 8'h1c: data <= 8'h04; //BYTE bDescriptionType; assigned by USB + 8'h1d: data <= 8'h00; //BYTE bInterfaceNumber + 8'h1e: data <= 8'h00; //BYTE bAlternateSetting + 8'h1f: data <= 8'h01; //BYTE bNumEndpoints; uses 1 endpoints + 8'h20: data <= 8'h03; //BYTE bInterfaceClass; HID Class - 0x03 + 8'h21: data <= 8'h01; //BYTE bInterfaceSubClass + 8'h22: data <= 8'h02; //BYTE bInterfaceProtocol + 8'h23: data <= 8'h00; //BYTE iInterface + +// ==================================== +// ===== HID Descriptor ===== +// ==================================== + 8'h24: data <= 8'h09; //BYTE bLength (HID Descriptor) + 8'h25: data <= 8'h21; //BYTE bDescriptorType + 8'h26: data <= 8'h10; //WORD (Lo) bcdHID + 8'h27: data <= 8'h01; //WORD (Hi) bcdHID + 8'h28: data <= 8'h00; //BYTE bCountryCode + 8'h29: data <= 8'h01; //BYTE bNumDescriptors + 8'h2a: data <= 8'h22; //BYTE bReportDescriptorType + 8'h2b: data <= 8'h32; //WORD (Lo) wItemLength + 8'h2c: data <= 8'h00; //WORD (Hi) wItemLength + +// ==================================== +// ===== Endpoint 1 Descriptor ===== +// ==================================== + 8'h2d: data <= 8'h07; //BYTE bLength (Endpoint Descriptor) + 8'h2e: data <= 8'h05; //BYTE bDescriptorType; assigned by USB + 8'h2f: data <= 8'h81; //BYTE bEndpointAddress; IN endpoint; endpoint 1 + 8'h30: data <= 8'h03; //BYTE bmAttributes; Interrupt endpoint + 8'h31: data <= 8'h10; //WORD (Lo) wMaxPacketSize + 8'h32: data <= 8'h00; //WORD (Hi) wMaxPacketSize + 8'h33: data <= 8'hFF; //BYTE bInterval + + +// ==================================== +// ===== Report Descriptor ===== +// ==================================== + + 8'h3a: data <= 8'h05; 8'h3b: data <= 8'h01; // USAGE_PAGE (Generic Desktop) + 8'h3c: data <= 8'h09; 8'h3d: data <= 8'h02; // USAGE (Mouse) + 8'h3e: data <= 8'ha1; 8'h3f: data <= 8'h01; // COLLECTION (Application) + 8'h40: data <= 8'h09; 8'h41: data <= 8'h01; // USAGE (Pointer) + 8'h42: data <= 8'ha1; 8'h43: data <= 8'h00; // COLLECTION (Physical) + 8'h44: data <= 8'h05; 8'h45: data <= 8'h09; // USAGE_PAGE (Button) + 8'h46: data <= 8'h19; 8'h47: data <= 8'h01; // USAGE_MINIMUM (Button 1) + 8'h48: data <= 8'h29; 8'h49: data <= 8'h03; // USAGE_MAXIMUM (Button 3) + 8'h4a: data <= 8'h15; 8'h4b: data <= 8'h00; // LOGICAL_MINIMUM (0) + 8'h4c: data <= 8'h25; 8'h4d: data <= 8'h01; // LOGICAL_MAXIMUM (1) + 8'h4e: data <= 8'h95; 8'h4f: data <= 8'h03; // REPORT_COUNT (3) + 8'h50: data <= 8'h75; 8'h51: data <= 8'h01; // REPORT_SIZE (1) + 8'h52: data <= 8'h81; 8'h53: data <= 8'h02; // INPUT (Data,Var,Abs) + 8'h54: data <= 8'h95; 8'h55: data <= 8'h01; // REPORT_COUNT (1) + 8'h56: data <= 8'h75; 8'h57: data <= 8'h05; // REPORT_SIZE (5) + 8'h58: data <= 8'h81; 8'h59: data <= 8'h01; // INPUT (Cnst,Var,Rel) + 8'h5a: data <= 8'h05; 8'h5b: data <= 8'h01; // USAGE_PAGE (Generic Desktop) + 8'h5c: data <= 8'h09; 8'h5d: data <= 8'h30; // USAGE (X) + 8'h5e: data <= 8'h09; 8'h5f: data <= 8'h31; // USAGE (Y) + 8'h60: data <= 8'h15; 8'h61: data <= 8'h81; // LOGICAL_MINIMUM (-127) + 8'h62: data <= 8'h25; 8'h63: data <= 8'h7f; // LOGICAL_MAXIMUM (127) + 8'h64: data <= 8'h75; 8'h65: data <= 8'h08; // REPORT_SIZE (8) + 8'h66: data <= 8'h95; 8'h67: data <= 8'h02; // REPORT_COUNT (2) + 8'h68: data <= 8'h81; 8'h69: data <= 8'h06; // INPUT (Data,Var,Rel) + 8'h6a: data <= 8'hc0; //END_COLLECTION + 8'h6b: data <= 8'hc0; // END_COLLECTION + +// ZERO_ZERO + 8'h6c: data <= 8'h00; + 8'h6d: data <= 8'h00; +// ONE_ZERO + 8'h6e: data <= 8'h01; + 8'h6f: data <= 8'h00; +// Vendor data + 8'h70: data <= 8'h00; + 8'h71: data <= 8'h00; + +// ============================================= +// ===== Language ID Descriptor(String0) ===== +// ============================================= + 8'h80: data <= 8'h04; // bLength + 8'h81: data <= 8'h03; // bDescriptorType = String Desc + 8'h82: data <= 8'h09; // wLangID (Lo) (Lang ID for English = 0x0409) + 8'h83: data <= 8'h04; // wLangID (Hi) (Lang ID for English = 0x0409) + +// ==================================== +// ===== string 1 Descriptor ===== +// ==================================== + 8'h90: data <= 8'd26; // bLength + 8'h91: data <= 8'h03; // bDescriptorType = String Desc + // Noting that text is always unicode, hence the 'padding' + 8'h92: data <= "B"; 8'h93: data <= 8'h00; + 8'h94: data <= "a"; 8'h95: data <= 8'h00; + 8'h96: data <= "s"; 8'h97: data <= 8'h00; + 8'h98: data <= "e"; 8'h99: data <= 8'h00; + 8'h9a: data <= "2"; 8'h9b: data <= 8'h00; + 8'h9c: data <= "D"; 8'h9d: data <= 8'h00; + 8'h9e: data <= "e"; 8'h9f: data <= 8'h00; + 8'ha0: data <= "s"; 8'ha1: data <= 8'h00; + 8'ha2: data <= "i"; 8'ha3: data <= 8'h00; + 8'ha4: data <= "g"; 8'ha5: data <= 8'h00; + 8'ha6: data <= "n"; 8'ha7: data <= 8'h00; + 8'ha8: data <= "s"; 8'ha9: data <= 8'h00; + + + +// ==================================== +// ===== string 2 Descriptor ===== +// ==================================== + 8'hb0: data <= 8'd20; // bLength + 8'hb1: data <= 8'h03; // bDescriptorType = String Desc + // Noting that text is always unicode, hence the 'padding' + 8'hb2: data <= "B"; 8'hb3: data <= 8'h00; + 8'hb4: data <= "2"; 8'hb5: data <= 8'h00; + 8'hb6: data <= "D"; 8'hb7: data <= 8'h00; + 8'hb8: data <= " "; 8'hb9: data <= 8'h00; + 8'hba: data <= "M"; 8'hbb: data <= 8'h00; + 8'hbc: data <= "o"; 8'hbd: data <= 8'h00; + 8'hbe: data <= "u"; 8'hbf: data <= 8'h00; + 8'hc0: data <= "s"; 8'hc1: data <= 8'h00; + 8'hc2: data <= "e"; 8'hc3: data <= 8'h00; + +// ==================================== +// ===== string 3 Descriptor ===== +// ==================================== + 8'hd0: data <= 8'd30; // bLength + 8'hd1: data <= 8'h03; // bDescriptorType = String Desc + // Noting that text is always unicode, hence the 'padding' + 8'hd2: data <= "L"; 8'hd3: data <= 8'h00; + 8'hd4: data <= "i"; 8'hd5: data <= 8'h00; + 8'hd6: data <= "m"; 8'hd7: data <= 8'h00; + 8'hd8: data <= "i"; 8'hd9: data <= 8'h00; + 8'hda: data <= "t"; 8'hdb: data <= 8'h00; + 8'hdc: data <= "e"; 8'hdd: data <= 8'h00; + 8'hde: data <= "d"; 8'hdf: data <= 8'h00; + 8'he0: data <= "E"; 8'he1: data <= 8'h00; + 8'he2: data <= "d"; 8'he3: data <= 8'h00; + 8'he4: data <= "i"; 8'he5: data <= 8'h00; + 8'he6: data <= "t"; 8'he7: data <= 8'h00; + 8'he8: data <= "i"; 8'he9: data <= 8'h00; + 8'hea: data <= "o"; 8'heb: data <= 8'h00; + 8'hec: data <= "n"; 8'hed: data <= 8'h00; + + + + default: data <= 8'h00; + endcase +end + +endmodule + + + Index: Actel/usbDeviceActelTop/hdl/slaveSendpacket.v =================================================================== --- Actel/usbDeviceActelTop/hdl/slaveSendpacket.v (nonexistent) +++ Actel/usbDeviceActelTop/hdl/slaveSendpacket.v (revision 40) @@ -0,0 +1,252 @@ + +// File : ../RTL/slaveController/slaveSendpacket.v +// Generated : 11/10/06 05:37:26 +// From : ../RTL/slaveController/slaveSendpacket.asf +// By : FSM2VHDL ver. 5.0.0.9 + +////////////////////////////////////////////////////////////////////// +//// //// +//// slaveSendPacket +//// //// +//// This file is part of the usbhostslave opencores effort. +//// http://www.opencores.org/cores/usbhostslave/ //// +//// //// +//// Module Description: //// +//// +//// //// +//// To Do: //// +//// +//// //// +//// Author(s): //// +//// - Steve Fielding, sfielding@base2designs.com //// +//// //// +////////////////////////////////////////////////////////////////////// +//// //// +//// Copyright (C) 2004 Steve Fielding and OPENCORES.ORG //// +//// //// +//// This source file may be used and distributed without //// +//// restriction provided that this copyright statement is not //// +//// removed from the file and that any derivative work contains //// +//// the original copyright notice and the associated disclaimer. //// +//// //// +//// This source file is free software; you can redistribute it //// +//// and/or modify it under the terms of the GNU Lesser General //// +//// Public License as published by the Free Software Foundation; //// +//// either version 2.1 of the License, or (at your option) any //// +//// later version. //// +//// //// +//// This source is distributed in the hope that it will be //// +//// useful, but WITHOUT ANY WARRANTY; without even the implied //// +//// warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR //// +//// PURPOSE. See the GNU Lesser General Public License for more //// +//// details. //// +//// //// +//// You should have received a copy of the GNU Lesser General //// +//// Public License along with this source; if not, download it //// +//// from http://www.opencores.org/lgpl.shtml //// +//// //// +////////////////////////////////////////////////////////////////////// +// +// +`include "timescale.v" +`include "usbSerialInterfaceEngine_h.v" +`include "usbConstants_h.v" + +module slaveSendPacket (PID, SCTxPortCntl, SCTxPortData, SCTxPortGnt, SCTxPortRdy, SCTxPortReq, SCTxPortWEn, clk, fifoData, fifoEmpty, fifoReadEn, rst, sendPacketRdy, sendPacketWEn); +input [3:0] PID; +input SCTxPortGnt; +input SCTxPortRdy; +input clk; +input [7:0] fifoData; +input fifoEmpty; +input rst; +input sendPacketWEn; +output [7:0] SCTxPortCntl; +output [7:0] SCTxPortData; +output SCTxPortReq; +output SCTxPortWEn; +output fifoReadEn; +output sendPacketRdy; + +wire [3:0] PID; +reg [7:0] SCTxPortCntl, next_SCTxPortCntl; +reg [7:0] SCTxPortData, next_SCTxPortData; +wire SCTxPortGnt; +wire SCTxPortRdy; +reg SCTxPortReq, next_SCTxPortReq; +reg SCTxPortWEn, next_SCTxPortWEn; +wire clk; +wire [7:0] fifoData; +wire fifoEmpty; +reg fifoReadEn, next_fifoReadEn; +wire rst; +reg sendPacketRdy, next_sendPacketRdy; +wire sendPacketWEn; + +// diagram signals declarations +reg [7:0]PIDNotPID; + +// BINARY ENCODED state machine: slvSndPkt +// State codes definitions: +`define START_SP1 4'b0000 +`define SP_WAIT_ENABLE 4'b0001 +`define SP1_WAIT_GNT 4'b0010 +`define SP_SEND_PID_WAIT_RDY 4'b0011 +`define SP_SEND_PID_FIN 4'b0100 +`define FIN_SP1 4'b0101 +`define SP_D0_D1_READ_FIFO 4'b0110 +`define SP_D0_D1_WAIT_READ_FIFO 4'b0111 +`define SP_D0_D1_FIFO_EMPTY 4'b1000 +`define SP_D0_D1_FIN 4'b1001 +`define SP_D0_D1_TERM_BYTE 4'b1010 +`define SP_NOT_DATA 4'b1011 +`define SP_D0_D1_CLR_WEN 4'b1100 +`define SP_D0_D1_CLR_REN 4'b1101 + +reg [3:0] CurrState_slvSndPkt; +reg [3:0] NextState_slvSndPkt; + +// Diagram actions (continuous assignments allowed only: assign ...) + +always @(PID) +begin + PIDNotPID <= { (PID ^ 4'hf), PID }; +end + +//-------------------------------------------------------------------- +// Machine: slvSndPkt +//-------------------------------------------------------------------- +//---------------------------------- +// Next State Logic (combinatorial) +//---------------------------------- +always @ (PIDNotPID or fifoData or sendPacketWEn or SCTxPortGnt or SCTxPortRdy or PID or fifoEmpty or sendPacketRdy or SCTxPortReq or SCTxPortWEn or SCTxPortData or SCTxPortCntl or fifoReadEn or CurrState_slvSndPkt) +begin : slvSndPkt_NextState + NextState_slvSndPkt <= CurrState_slvSndPkt; + // Set default values for outputs and signals + next_sendPacketRdy <= sendPacketRdy; + next_SCTxPortReq <= SCTxPortReq; + next_SCTxPortWEn <= SCTxPortWEn; + next_SCTxPortData <= SCTxPortData; + next_SCTxPortCntl <= SCTxPortCntl; + next_fifoReadEn <= fifoReadEn; + case (CurrState_slvSndPkt) + `START_SP1: + NextState_slvSndPkt <= `SP_WAIT_ENABLE; + `SP_WAIT_ENABLE: + if (sendPacketWEn == 1'b1) + begin + NextState_slvSndPkt <= `SP1_WAIT_GNT; + next_sendPacketRdy <= 1'b0; + next_SCTxPortReq <= 1'b1; + end + `SP1_WAIT_GNT: + if (SCTxPortGnt == 1'b1) + NextState_slvSndPkt <= `SP_SEND_PID_WAIT_RDY; + `FIN_SP1: + begin + NextState_slvSndPkt <= `SP_WAIT_ENABLE; + next_sendPacketRdy <= 1'b1; + next_SCTxPortReq <= 1'b0; + end + `SP_NOT_DATA: + NextState_slvSndPkt <= `FIN_SP1; + `SP_SEND_PID_WAIT_RDY: + if (SCTxPortRdy == 1'b1) + begin + NextState_slvSndPkt <= `SP_SEND_PID_FIN; + next_SCTxPortWEn <= 1'b1; + next_SCTxPortData <= PIDNotPID; + next_SCTxPortCntl <= `TX_PACKET_START; + end + `SP_SEND_PID_FIN: + begin + next_SCTxPortWEn <= 1'b0; + if (PID == `DATA0 || PID == `DATA1) + NextState_slvSndPkt <= `SP_D0_D1_FIFO_EMPTY; + else + NextState_slvSndPkt <= `SP_NOT_DATA; + end + `SP_D0_D1_READ_FIFO: + begin + next_SCTxPortWEn <= 1'b1; + next_SCTxPortData <= fifoData; + next_SCTxPortCntl <= `TX_PACKET_STREAM; + NextState_slvSndPkt <= `SP_D0_D1_CLR_WEN; + end + `SP_D0_D1_WAIT_READ_FIFO: + if (SCTxPortRdy == 1'b1) + begin + NextState_slvSndPkt <= `SP_D0_D1_CLR_REN; + next_fifoReadEn <= 1'b1; + end + `SP_D0_D1_FIFO_EMPTY: + if (fifoEmpty == 1'b0) + NextState_slvSndPkt <= `SP_D0_D1_WAIT_READ_FIFO; + else + NextState_slvSndPkt <= `SP_D0_D1_TERM_BYTE; + `SP_D0_D1_FIN: + begin + next_SCTxPortWEn <= 1'b0; + NextState_slvSndPkt <= `FIN_SP1; + end + `SP_D0_D1_TERM_BYTE: + if (SCTxPortRdy == 1'b1) + begin + NextState_slvSndPkt <= `SP_D0_D1_FIN; + //Last byte is not valid data, + //but the 'TX_PACKET_STOP' flag is required + //by the SIE state machine to detect end of data packet + next_SCTxPortWEn <= 1'b1; + next_SCTxPortData <= 8'h00; + next_SCTxPortCntl <= `TX_PACKET_STOP; + end + `SP_D0_D1_CLR_WEN: + begin + next_SCTxPortWEn <= 1'b0; + NextState_slvSndPkt <= `SP_D0_D1_FIFO_EMPTY; + end + `SP_D0_D1_CLR_REN: + begin + next_fifoReadEn <= 1'b0; + NextState_slvSndPkt <= `SP_D0_D1_READ_FIFO; + end + endcase +end + +//---------------------------------- +// Current State Logic (sequential) +//---------------------------------- +always @ (posedge clk) +begin : slvSndPkt_CurrentState + if (rst) + CurrState_slvSndPkt <= `START_SP1; + else + CurrState_slvSndPkt <= NextState_slvSndPkt; +end + +//---------------------------------- +// Registered outputs logic +//---------------------------------- +always @ (posedge clk) +begin : slvSndPkt_RegOutput + if (rst) + begin + sendPacketRdy <= 1'b1; + SCTxPortReq <= 1'b0; + SCTxPortWEn <= 1'b0; + SCTxPortData <= 8'h00; + SCTxPortCntl <= 8'h00; + fifoReadEn <= 1'b0; + end + else + begin + sendPacketRdy <= next_sendPacketRdy; + SCTxPortReq <= next_SCTxPortReq; + SCTxPortWEn <= next_SCTxPortWEn; + SCTxPortData <= next_SCTxPortData; + SCTxPortCntl <= next_SCTxPortCntl; + fifoReadEn <= next_fifoReadEn; + end +end + +endmodule \ No newline at end of file Index: Actel/usbDeviceActelTop/hdl/fifoMux.v =================================================================== --- Actel/usbDeviceActelTop/hdl/fifoMux.v (nonexistent) +++ Actel/usbDeviceActelTop/hdl/fifoMux.v (revision 40) @@ -0,0 +1,212 @@ +////////////////////////////////////////////////////////////////////// +//// //// +//// fifoMux.v //// +//// //// +//// This file is part of the usbhostslave opencores effort. +//// //// +//// //// +//// Module Description: //// +//// +//// //// +//// To Do: //// +//// +//// //// +//// Author(s): //// +//// - Steve Fielding, sfielding@base2designs.com //// +//// //// +////////////////////////////////////////////////////////////////////// +//// //// +//// Copyright (C) 2004 Steve Fielding and OPENCORES.ORG //// +//// //// +//// This source file may be used and distributed without //// +//// restriction provided that this copyright statement is not //// +//// removed from the file and that any derivative work contains //// +//// the original copyright notice and the associated disclaimer. //// +//// //// +//// This source file is free software; you can redistribute it //// +//// and/or modify it under the terms of the GNU Lesser General //// +//// Public License as published by the Free Software Foundation; //// +//// either version 2.1 of the License, or (at your option) any //// +//// later version. //// +//// //// +//// This source is distributed in the hope that it will be //// +//// useful, but WITHOUT ANY WARRANTY; without even the implied //// +//// warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR //// +//// PURPOSE. See the GNU Lesser General Public License for more //// +//// details. //// +//// //// +//// You should have received a copy of the GNU Lesser General //// +//// Public License along with this source; if not, download it //// +//// from //// +//// //// +////////////////////////////////////////////////////////////////////// +// +`include "timescale.v" + +module fifoMux ( + currEndP, + //TxFifo + TxFifoREn, + TxFifoEP0REn, + TxFifoEP1REn, + TxFifoEP2REn, + TxFifoEP3REn, + TxFifoData, + TxFifoEP0Data, + TxFifoEP1Data, + TxFifoEP2Data, + TxFifoEP3Data, + TxFifoEmpty, + TxFifoEP0Empty, + TxFifoEP1Empty, + TxFifoEP2Empty, + TxFifoEP3Empty, + //RxFifo + RxFifoWEn, + RxFifoEP0WEn, + RxFifoEP1WEn, + RxFifoEP2WEn, + RxFifoEP3WEn, + RxFifoFull, + RxFifoEP0Full, + RxFifoEP1Full, + RxFifoEP2Full, + RxFifoEP3Full + ); + + +input [3:0] currEndP; +//TxFifo +input TxFifoREn; +output TxFifoEP0REn; +output TxFifoEP1REn; +output TxFifoEP2REn; +output TxFifoEP3REn; +output [7:0] TxFifoData; +input [7:0] TxFifoEP0Data; +input [7:0] TxFifoEP1Data; +input [7:0] TxFifoEP2Data; +input [7:0] TxFifoEP3Data; +output TxFifoEmpty; +input TxFifoEP0Empty; +input TxFifoEP1Empty; +input TxFifoEP2Empty; +input TxFifoEP3Empty; + //RxFifo +input RxFifoWEn; +output RxFifoEP0WEn; +output RxFifoEP1WEn; +output RxFifoEP2WEn; +output RxFifoEP3WEn; +output RxFifoFull; +input RxFifoEP0Full; +input RxFifoEP1Full; +input RxFifoEP2Full; +input RxFifoEP3Full; + +wire [3:0] currEndP; +//TxFifo +wire TxFifoREn; +reg TxFifoEP0REn; +reg TxFifoEP1REn; +reg TxFifoEP2REn; +reg TxFifoEP3REn; +reg [7:0] TxFifoData; +wire [7:0] TxFifoEP0Data; +wire [7:0] TxFifoEP1Data; +wire [7:0] TxFifoEP2Data; +wire [7:0] TxFifoEP3Data; +reg TxFifoEmpty; +wire TxFifoEP0Empty; +wire TxFifoEP1Empty; +wire TxFifoEP2Empty; +wire TxFifoEP3Empty; + //RxFifo +wire RxFifoWEn; +reg RxFifoEP0WEn; +reg RxFifoEP1WEn; +reg RxFifoEP2WEn; +reg RxFifoEP3WEn; +reg RxFifoFull; +wire RxFifoEP0Full; +wire RxFifoEP1Full; +wire RxFifoEP2Full; +wire RxFifoEP3Full; + +//internal wires and regs + +//combinatorially mux TX and RX fifos for end points 0 through 3 +always @(currEndP or + TxFifoREn or + RxFifoWEn or + TxFifoEP0Data or + TxFifoEP1Data or + TxFifoEP2Data or + TxFifoEP3Data or + TxFifoEP0Empty or + TxFifoEP1Empty or + TxFifoEP2Empty or + TxFifoEP3Empty or + RxFifoEP0Full or + RxFifoEP1Full or + RxFifoEP2Full or + RxFifoEP3Full) +begin + case (currEndP[1:0]) + 2'b00: begin + TxFifoEP0REn <= TxFifoREn; + TxFifoEP1REn <= 1'b0; + TxFifoEP2REn <= 1'b0; + TxFifoEP3REn <= 1'b0; + TxFifoData <= TxFifoEP0Data; + TxFifoEmpty <= TxFifoEP0Empty; + RxFifoEP0WEn <= RxFifoWEn; + RxFifoEP1WEn <= 1'b0; + RxFifoEP2WEn <= 1'b0; + RxFifoEP3WEn <= 1'b0; + RxFifoFull <= RxFifoEP0Full; + end + 2'b01: begin + TxFifoEP0REn <= 1'b0; + TxFifoEP1REn <= TxFifoREn; + TxFifoEP2REn <= 1'b0; + TxFifoEP3REn <= 1'b0; + TxFifoData <= TxFifoEP1Data; + TxFifoEmpty <= TxFifoEP1Empty; + RxFifoEP0WEn <= 1'b0; + RxFifoEP1WEn <= RxFifoWEn; + RxFifoEP2WEn <= 1'b0; + RxFifoEP3WEn <= 1'b0; + RxFifoFull <= RxFifoEP1Full; + end + 2'b10: begin + TxFifoEP0REn <= 1'b0; + TxFifoEP1REn <= 1'b0; + TxFifoEP2REn <= TxFifoREn; + TxFifoEP3REn <= 1'b0; + TxFifoData <= TxFifoEP2Data; + TxFifoEmpty <= TxFifoEP2Empty; + RxFifoEP0WEn <= 1'b0; + RxFifoEP1WEn <= 1'b0; + RxFifoEP2WEn <= RxFifoWEn; + RxFifoEP3WEn <= 1'b0; + RxFifoFull <= RxFifoEP2Full; + end + 2'b11: begin + TxFifoEP0REn <= 1'b0; + TxFifoEP1REn <= 1'b0; + TxFifoEP2REn <= 1'b0; + TxFifoEP3REn <= TxFifoREn; + TxFifoData <= TxFifoEP3Data; + TxFifoEmpty <= TxFifoEP3Empty; + RxFifoEP0WEn <= 1'b0; + RxFifoEP1WEn <= 1'b0; + RxFifoEP2WEn <= 1'b0; + RxFifoEP3WEn <= RxFifoWEn; + RxFifoFull <= RxFifoEP3Full; + end + endcase +end + + +endmodule Index: Actel/usbDeviceActelTop/hdl/SIETransmitter.v =================================================================== --- Actel/usbDeviceActelTop/hdl/SIETransmitter.v (nonexistent) +++ Actel/usbDeviceActelTop/hdl/SIETransmitter.v (revision 40) @@ -0,0 +1,714 @@ + +// File : ../RTL/serialInterfaceEngine/SIETransmitter.v +// Generated : 10/15/06 20:31:22 +// From : ../RTL/serialInterfaceEngine/SIETransmitter.asf +// By : FSM2VHDL ver. 5.0.0.9 + +////////////////////////////////////////////////////////////////////// +//// //// +//// SIETransmitter +//// //// +//// This file is part of the usbhostslave opencores effort. +//// http://www.opencores.org/cores/usbhostslave/ //// +//// //// +//// Module Description: //// +//// +//// //// +//// To Do: //// +//// +//// //// +//// Author(s): //// +//// - Steve Fielding, sfielding@base2designs.com //// +//// //// +////////////////////////////////////////////////////////////////////// +//// //// +//// Copyright (C) 2004 Steve Fielding and OPENCORES.ORG //// +//// //// +//// This source file may be used and distributed without //// +//// restriction provided that this copyright statement is not //// +//// removed from the file and that any derivative work contains //// +//// the original copyright notice and the associated disclaimer. //// +//// //// +//// This source file is free software; you can redistribute it //// +//// and/or modify it under the terms of the GNU Lesser General //// +//// Public License as published by the Free Software Foundation; //// +//// either version 2.1 of the License, or (at your option) any //// +//// later version. //// +//// //// +//// This source is distributed in the hope that it will be //// +//// useful, but WITHOUT ANY WARRANTY; without even the implied //// +//// warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR //// +//// PURPOSE. See the GNU Lesser General Public License for more //// +//// details. //// +//// //// +//// You should have received a copy of the GNU Lesser General //// +//// Public License along with this source; if not, download it //// +//// from http://www.opencores.org/lgpl.shtml //// +//// //// +////////////////////////////////////////////////////////////////////// +// +`include "timescale.v" +`include "usbSerialInterfaceEngine_h.v" +`include "usbConstants_h.v" + + +module SIETransmitter (CRC16En, CRC16Result, CRC16UpdateRdy, CRC5En, CRC5Result, CRC5UpdateRdy, CRC5_8Bit, CRCData, JBit, KBit, SIEPortCtrlIn, SIEPortDataIn, SIEPortTxRdy, SIEPortWEn, TxByteOutCtrl, TxByteOutFullSpeedRate, TxByteOut, USBWireCtrl, USBWireData, USBWireFullSpeedRate, USBWireGnt, USBWireRdy, USBWireReq, USBWireWEn, clk, fullSpeedRateIn, processTxByteRdy, processTxByteWEn, rst, rstCRC); +input [15:0] CRC16Result; +input CRC16UpdateRdy; +input [4:0] CRC5Result; +input CRC5UpdateRdy; +input [1:0] JBit; +input [1:0] KBit; +input [7:0] SIEPortCtrlIn; +input [7:0] SIEPortDataIn; +input SIEPortWEn; +input USBWireGnt; +input USBWireRdy; +input clk; +input fullSpeedRateIn; +input processTxByteRdy; +input rst; +output CRC16En; +output CRC5En; +output CRC5_8Bit; +output [7:0] CRCData; +output SIEPortTxRdy; +output [7:0] TxByteOutCtrl; +output TxByteOutFullSpeedRate; +output [7:0] TxByteOut; +output USBWireCtrl; +output [1:0] USBWireData; +output USBWireFullSpeedRate; +output USBWireReq; +output USBWireWEn; +output processTxByteWEn; +output rstCRC; + +reg CRC16En, next_CRC16En; +wire [15:0] CRC16Result; +wire CRC16UpdateRdy; +reg CRC5En, next_CRC5En; +wire [4:0] CRC5Result; +wire CRC5UpdateRdy; +reg CRC5_8Bit, next_CRC5_8Bit; +reg [7:0] CRCData, next_CRCData; +wire [1:0] JBit; +wire [1:0] KBit; +wire [7:0] SIEPortCtrlIn; +wire [7:0] SIEPortDataIn; +reg SIEPortTxRdy, next_SIEPortTxRdy; +wire SIEPortWEn; +reg [7:0] TxByteOutCtrl, next_TxByteOutCtrl; +reg TxByteOutFullSpeedRate, next_TxByteOutFullSpeedRate; +reg [7:0] TxByteOut, next_TxByteOut; +reg USBWireCtrl, next_USBWireCtrl; +reg [1:0] USBWireData, next_USBWireData; +reg USBWireFullSpeedRate, next_USBWireFullSpeedRate; +wire USBWireGnt; +wire USBWireRdy; +reg USBWireReq, next_USBWireReq; +reg USBWireWEn, next_USBWireWEn; +wire clk; +wire fullSpeedRateIn; +wire processTxByteRdy; +reg processTxByteWEn, next_processTxByteWEn; +wire rst; +reg rstCRC, next_rstCRC; + +// diagram signals declarations +reg [7:0]SIEPortCtrl, next_SIEPortCtrl; +reg [7:0]SIEPortData, next_SIEPortData; +reg [2:0]i, next_i; +reg [15:0]resumeCnt, next_resumeCnt; + +// BINARY ENCODED state machine: SIETx +// State codes definitions: +`define DIR_CTL_CHK_FIN 6'b000000 +`define RES_ST_CHK_FIN 6'b000001 +`define PKT_ST_CHK_PID 6'b000010 +`define PKT_ST_DATA_DATA_CHK_STOP 6'b000011 +`define IDLE 6'b000100 +`define PKT_ST_DATA_DATA_PKT_SENT 6'b000101 +`define PKT_ST_DATA_PID_PKT_SENT 6'b000110 +`define PKT_ST_HS_PKT_SENT 6'b000111 +`define PKT_ST_TKN_CRC_PKT_SENT 6'b001000 +`define PKT_ST_TKN_PID_PKT_SENT 6'b001001 +`define PKT_ST_SPCL_PKT_SENT 6'b001010 +`define PKT_ST_DATA_CRC_PKT_SENT1 6'b001011 +`define PKT_ST_TKN_BYTE1_PKT_SENT1 6'b001100 +`define PKT_ST_DATA_CRC_PKT_SENT2 6'b001101 +`define RES_ST_SND_J_1 6'b001110 +`define RES_ST_SND_J_2 6'b001111 +`define RES_ST_SND_SE0_1 6'b010000 +`define RES_ST_SND_SE0_2 6'b010001 +`define START_SIETX 6'b010010 +`define STX_CHK_ST 6'b010011 +`define STX_WAIT_BYTE 6'b010100 +`define PKT_ST_TKN_CRC_UPD_CRC 6'b010101 +`define PKT_ST_TKN_BYTE1_UPD_CRC 6'b010110 +`define PKT_ST_DATA_DATA_UPD_CRC 6'b010111 +`define PKT_ST_TKN_CRC_WAIT_BYTE 6'b011000 +`define PKT_ST_TKN_BYTE1_WAIT_BYTE 6'b011001 +`define PKT_ST_DATA_DATA_WAIT_BYTE 6'b011010 +`define DIR_CTL_WAIT_GNT 6'b011011 +`define RES_ST_WAIT_GNT 6'b011100 +`define PKT_ST_HS_WAIT_RDY 6'b011101 +`define DIR_CTL_WAIT_RDY 6'b011110 +`define PKT_ST_SPCL_WAIT_RDY 6'b011111 +`define PKT_ST_TKN_CRC_WAIT_RDY 6'b100000 +`define PKT_ST_TKN_PID_WAIT_RDY 6'b100001 +`define PKT_ST_DATA_DATA_WAIT_RDY 6'b100010 +`define RES_ST_WAIT_RDY 6'b100011 +`define PKT_ST_TKN_BYTE1_WAIT_RDY 6'b100100 +`define PKT_ST_DATA_PID_WAIT_RDY 6'b100101 +`define PKT_ST_DATA_CRC_WAIT_RDY1 6'b100110 +`define PKT_ST_DATA_CRC_WAIT_RDY2 6'b100111 +`define PKT_ST_WAIT_RDY_PKT 6'b101000 +`define RES_ST_W_RDY1 6'b101001 +`define PKT_ST_TKN_CRC_WAIT_CRC_RDY 6'b101010 +`define PKT_ST_DATA_DATA_WAIT_CRC_RDY 6'b101011 +`define PKT_ST_TKN_BYTE1_WAIT_CRC_RDY 6'b101100 +`define TX_LS_EOP_WAIT_GNT1 6'b101101 +`define TX_LS_EOP_SND_SE0_2 6'b101110 +`define TX_LS_EOP_SND_SE0_1 6'b101111 +`define TX_LS_EOP_W_RDY1 6'b110000 +`define TX_LS_EOP_SND_J 6'b110001 +`define TX_LS_EOP_W_RDY2 6'b110010 +`define TX_LS_EOP_W_RDY3 6'b110011 +`define RES_ST_DELAY 6'b110100 +`define RES_ST_W_RDY2 6'b110101 +`define RES_ST_W_RDY3 6'b110110 +`define RES_ST_W_RDY4 6'b110111 +`define DIR_CTL_DELAY 6'b111000 + +reg [5:0] CurrState_SIETx; +reg [5:0] NextState_SIETx; + + +//-------------------------------------------------------------------- +// Machine: SIETx +//-------------------------------------------------------------------- +//---------------------------------- +// Next State Logic (combinatorial) +//---------------------------------- +always @ (SIEPortDataIn or SIEPortCtrlIn or fullSpeedRateIn or i or SIEPortData or CRC16Result or CRC5Result or KBit or resumeCnt or JBit or SIEPortCtrl or SIEPortWEn or USBWireGnt or USBWireRdy or processTxByteRdy or CRC16UpdateRdy or CRC5UpdateRdy or processTxByteWEn or TxByteOut or TxByteOutCtrl or USBWireData or USBWireCtrl or USBWireReq or USBWireWEn or rstCRC or CRCData or CRC5En or CRC5_8Bit or CRC16En or SIEPortTxRdy or TxByteOutFullSpeedRate or USBWireFullSpeedRate or CurrState_SIETx) +begin : SIETx_NextState + NextState_SIETx <= CurrState_SIETx; + // Set default values for outputs and signals + next_processTxByteWEn <= processTxByteWEn; + next_TxByteOut <= TxByteOut; + next_TxByteOutCtrl <= TxByteOutCtrl; + next_USBWireData <= USBWireData; + next_USBWireCtrl <= USBWireCtrl; + next_USBWireReq <= USBWireReq; + next_USBWireWEn <= USBWireWEn; + next_rstCRC <= rstCRC; + next_CRCData <= CRCData; + next_CRC5En <= CRC5En; + next_CRC5_8Bit <= CRC5_8Bit; + next_CRC16En <= CRC16En; + next_SIEPortTxRdy <= SIEPortTxRdy; + next_SIEPortData <= SIEPortData; + next_SIEPortCtrl <= SIEPortCtrl; + next_i <= i; + next_resumeCnt <= resumeCnt; + next_TxByteOutFullSpeedRate <= TxByteOutFullSpeedRate; + next_USBWireFullSpeedRate <= USBWireFullSpeedRate; + case (CurrState_SIETx) + `IDLE: + NextState_SIETx <= `STX_WAIT_BYTE; + `START_SIETX: + begin + next_processTxByteWEn <= 1'b0; + next_TxByteOut <= 8'h00; + next_TxByteOutCtrl <= 8'h00; + next_USBWireData <= 2'b00; + next_USBWireCtrl <= `TRI_STATE; + next_USBWireReq <= 1'b0; + next_USBWireWEn <= 1'b0; + next_rstCRC <= 1'b0; + next_CRCData <= 8'h00; + next_CRC5En <= 1'b0; + next_CRC5_8Bit <= 1'b0; + next_CRC16En <= 1'b0; + next_SIEPortTxRdy <= 1'b0; + next_SIEPortData <= 8'h00; + next_SIEPortCtrl <= 8'h00; + next_i <= 3'h0; + next_resumeCnt <= 16'h0000; + next_TxByteOutFullSpeedRate <= 1'b0; + next_USBWireFullSpeedRate <= 1'b0; + NextState_SIETx <= `STX_WAIT_BYTE; + end + `STX_CHK_ST: + if ((SIEPortCtrl == `TX_PACKET_START) && (SIEPortData[3:0] == `SOF || SIEPortData[3:0] == `PREAMBLE)) + begin + NextState_SIETx <= `PKT_ST_WAIT_RDY_PKT; + next_TxByteOutFullSpeedRate <= 1'b1; + //SOF and PRE always at full speed + end + else if (SIEPortCtrl == `TX_PACKET_START) + NextState_SIETx <= `PKT_ST_WAIT_RDY_PKT; + else if (SIEPortCtrl == `TX_LS_KEEP_ALIVE) + begin + NextState_SIETx <= `TX_LS_EOP_WAIT_GNT1; + next_USBWireReq <= 1'b1; + end + else if (SIEPortCtrl == `TX_DIRECT_CONTROL) + begin + NextState_SIETx <= `DIR_CTL_WAIT_GNT; + next_USBWireReq <= 1'b1; + end + else if (SIEPortCtrl == `TX_IDLE) + NextState_SIETx <= `IDLE; + else if (SIEPortCtrl == `TX_RESUME_START) + begin + NextState_SIETx <= `RES_ST_WAIT_GNT; + next_USBWireReq <= 1'b1; + next_resumeCnt <= 16'h0000; + next_USBWireFullSpeedRate <= 1'b0; + //resume always uses low speed timing + end + `STX_WAIT_BYTE: + begin + next_SIEPortTxRdy <= 1'b1; + if (SIEPortWEn == 1'b1) + begin + NextState_SIETx <= `STX_CHK_ST; + next_SIEPortData <= SIEPortDataIn; + next_SIEPortCtrl <= SIEPortCtrlIn; + next_SIEPortTxRdy <= 1'b0; + next_TxByteOutFullSpeedRate <= fullSpeedRateIn; + next_USBWireFullSpeedRate <= fullSpeedRateIn; + end + end + `DIR_CTL_CHK_FIN: + begin + next_USBWireWEn <= 1'b0; + next_i <= i + 1'b1; + if (i == 3'h7) + begin + NextState_SIETx <= `STX_WAIT_BYTE; + next_USBWireReq <= 1'b0; + end + else + NextState_SIETx <= `DIR_CTL_DELAY; + end + `DIR_CTL_WAIT_GNT: + begin + next_i <= 3'h0; + if (USBWireGnt == 1'b1) + NextState_SIETx <= `DIR_CTL_WAIT_RDY; + end + `DIR_CTL_WAIT_RDY: + if (USBWireRdy == 1'b1) + begin + NextState_SIETx <= `DIR_CTL_CHK_FIN; + next_USBWireData <= SIEPortData[1:0]; + next_USBWireCtrl <= `DRIVE; + next_USBWireWEn <= 1'b1; + end + `DIR_CTL_DELAY: + NextState_SIETx <= `DIR_CTL_WAIT_RDY; + `PKT_ST_CHK_PID: + begin + next_processTxByteWEn <= 1'b0; + if (SIEPortData[1:0] == `TOKEN) + NextState_SIETx <= `PKT_ST_TKN_PID_WAIT_RDY; + else if (SIEPortData[1:0] == `HANDSHAKE) + NextState_SIETx <= `PKT_ST_HS_WAIT_RDY; + else if (SIEPortData[1:0] == `DATA) + NextState_SIETx <= `PKT_ST_DATA_PID_WAIT_RDY; + else if (SIEPortData[1:0] == `SPECIAL) + NextState_SIETx <= `PKT_ST_SPCL_WAIT_RDY; + end + `PKT_ST_WAIT_RDY_PKT: + if (processTxByteRdy == 1'b1) + begin + NextState_SIETx <= `PKT_ST_CHK_PID; + next_processTxByteWEn <= 1'b1; + next_TxByteOut <= `SYNC_BYTE; + next_TxByteOutCtrl <= `DATA_START; + end + `PKT_ST_DATA_CRC_PKT_SENT1: + begin + next_processTxByteWEn <= 1'b0; + NextState_SIETx <= `PKT_ST_DATA_CRC_WAIT_RDY2; + end + `PKT_ST_DATA_CRC_PKT_SENT2: + begin + next_processTxByteWEn <= 1'b0; + NextState_SIETx <= `STX_WAIT_BYTE; + end + `PKT_ST_DATA_CRC_WAIT_RDY1: + if (processTxByteRdy == 1'b1) + begin + NextState_SIETx <= `PKT_ST_DATA_CRC_PKT_SENT1; + next_processTxByteWEn <= 1'b1; + next_TxByteOut <= ~CRC16Result[7:0]; + next_TxByteOutCtrl <= `DATA_STREAM; + end + `PKT_ST_DATA_CRC_WAIT_RDY2: + if (processTxByteRdy == 1'b1) + begin + NextState_SIETx <= `PKT_ST_DATA_CRC_PKT_SENT2; + next_processTxByteWEn <= 1'b1; + next_TxByteOut <= ~CRC16Result[15:8]; + next_TxByteOutCtrl <= `DATA_STOP; + end + `PKT_ST_DATA_DATA_CHK_STOP: + if (SIEPortCtrl == `TX_PACKET_STOP) + NextState_SIETx <= `PKT_ST_DATA_CRC_WAIT_RDY1; + else + NextState_SIETx <= `PKT_ST_DATA_DATA_WAIT_CRC_RDY; + `PKT_ST_DATA_DATA_PKT_SENT: + begin + next_processTxByteWEn <= 1'b0; + NextState_SIETx <= `PKT_ST_DATA_DATA_WAIT_BYTE; + end + `PKT_ST_DATA_DATA_UPD_CRC: + begin + next_CRCData <= SIEPortData; + next_CRC16En <= 1'b1; + NextState_SIETx <= `PKT_ST_DATA_DATA_WAIT_RDY; + end + `PKT_ST_DATA_DATA_WAIT_BYTE: + begin + next_SIEPortTxRdy <= 1'b1; + if (SIEPortWEn == 1'b1) + begin + NextState_SIETx <= `PKT_ST_DATA_DATA_CHK_STOP; + next_SIEPortData <= SIEPortDataIn; + next_SIEPortCtrl <= SIEPortCtrlIn; + next_SIEPortTxRdy <= 1'b0; + end + end + `PKT_ST_DATA_DATA_WAIT_RDY: + begin + next_CRC16En <= 1'b0; + if (processTxByteRdy == 1'b1) + begin + NextState_SIETx <= `PKT_ST_DATA_DATA_PKT_SENT; + next_processTxByteWEn <= 1'b1; + next_TxByteOut <= SIEPortData; + next_TxByteOutCtrl <= `DATA_STREAM; + end + end + `PKT_ST_DATA_DATA_WAIT_CRC_RDY: + if (CRC16UpdateRdy == 1'b1) + NextState_SIETx <= `PKT_ST_DATA_DATA_UPD_CRC; + `PKT_ST_DATA_PID_PKT_SENT: + begin + next_processTxByteWEn <= 1'b0; + next_rstCRC <= 1'b0; + NextState_SIETx <= `PKT_ST_DATA_DATA_WAIT_BYTE; + end + `PKT_ST_DATA_PID_WAIT_RDY: + if (processTxByteRdy == 1'b1) + begin + NextState_SIETx <= `PKT_ST_DATA_PID_PKT_SENT; + next_processTxByteWEn <= 1'b1; + next_TxByteOut <= SIEPortData; + next_TxByteOutCtrl <= `DATA_STREAM; + next_rstCRC <= 1'b1; + end + `PKT_ST_HS_PKT_SENT: + begin + next_processTxByteWEn <= 1'b0; + NextState_SIETx <= `STX_WAIT_BYTE; + end + `PKT_ST_HS_WAIT_RDY: + if (processTxByteRdy == 1'b1) + begin + NextState_SIETx <= `PKT_ST_HS_PKT_SENT; + next_processTxByteWEn <= 1'b1; + next_TxByteOut <= SIEPortData; + next_TxByteOutCtrl <= `DATA_STOP; + end + `PKT_ST_SPCL_PKT_SENT: + begin + next_processTxByteWEn <= 1'b0; + NextState_SIETx <= `STX_WAIT_BYTE; + end + `PKT_ST_SPCL_WAIT_RDY: + if (processTxByteRdy == 1'b1) + begin + NextState_SIETx <= `PKT_ST_SPCL_PKT_SENT; + next_processTxByteWEn <= 1'b1; + next_TxByteOut <= SIEPortData; + next_TxByteOutCtrl <= `DATA_STOP; + end + `PKT_ST_TKN_BYTE1_PKT_SENT1: + begin + next_processTxByteWEn <= 1'b0; + NextState_SIETx <= `PKT_ST_TKN_CRC_WAIT_BYTE; + end + `PKT_ST_TKN_BYTE1_UPD_CRC: + begin + next_CRCData <= SIEPortData; + next_CRC5_8Bit <= 1'b1; + next_CRC5En <= 1'b1; + NextState_SIETx <= `PKT_ST_TKN_BYTE1_WAIT_RDY; + end + `PKT_ST_TKN_BYTE1_WAIT_BYTE: + begin + next_SIEPortTxRdy <= 1'b1; + if (SIEPortWEn == 1'b1) + begin + NextState_SIETx <= `PKT_ST_TKN_BYTE1_WAIT_CRC_RDY; + next_SIEPortData <= SIEPortDataIn; + next_SIEPortCtrl <= SIEPortCtrlIn; + next_SIEPortTxRdy <= 1'b0; + end + end + `PKT_ST_TKN_BYTE1_WAIT_RDY: + begin + next_CRC5En <= 1'b0; + if (processTxByteRdy == 1'b1) + begin + NextState_SIETx <= `PKT_ST_TKN_BYTE1_PKT_SENT1; + next_processTxByteWEn <= 1'b1; + next_TxByteOut <= SIEPortData; + next_TxByteOutCtrl <= `DATA_STREAM; + end + end + `PKT_ST_TKN_BYTE1_WAIT_CRC_RDY: + if (CRC5UpdateRdy == 1'b1) + NextState_SIETx <= `PKT_ST_TKN_BYTE1_UPD_CRC; + `PKT_ST_TKN_CRC_PKT_SENT: + begin + next_processTxByteWEn <= 1'b0; + NextState_SIETx <= `STX_WAIT_BYTE; + end + `PKT_ST_TKN_CRC_UPD_CRC: + begin + next_CRCData <= SIEPortData; + next_CRC5_8Bit <= 1'b0; + next_CRC5En <= 1'b1; + NextState_SIETx <= `PKT_ST_TKN_CRC_WAIT_RDY; + end + `PKT_ST_TKN_CRC_WAIT_BYTE: + begin + next_SIEPortTxRdy <= 1'b1; + if (SIEPortWEn == 1'b1) + begin + NextState_SIETx <= `PKT_ST_TKN_CRC_WAIT_CRC_RDY; + next_SIEPortData <= SIEPortDataIn; + next_SIEPortCtrl <= SIEPortCtrlIn; + next_SIEPortTxRdy <= 1'b0; + end + end + `PKT_ST_TKN_CRC_WAIT_RDY: + begin + next_CRC5En <= 1'b0; + if (processTxByteRdy == 1'b1) + begin + NextState_SIETx <= `PKT_ST_TKN_CRC_PKT_SENT; + next_processTxByteWEn <= 1'b1; + next_TxByteOut <= {~CRC5Result, SIEPortData[2:0] }; + next_TxByteOutCtrl <= `DATA_STOP; + end + end + `PKT_ST_TKN_CRC_WAIT_CRC_RDY: + if (CRC5UpdateRdy == 1'b1) + NextState_SIETx <= `PKT_ST_TKN_CRC_UPD_CRC; + `PKT_ST_TKN_PID_PKT_SENT: + begin + next_processTxByteWEn <= 1'b0; + next_rstCRC <= 1'b0; + NextState_SIETx <= `PKT_ST_TKN_BYTE1_WAIT_BYTE; + end + `PKT_ST_TKN_PID_WAIT_RDY: + if (processTxByteRdy == 1'b1) + begin + NextState_SIETx <= `PKT_ST_TKN_PID_PKT_SENT; + next_processTxByteWEn <= 1'b1; + next_TxByteOut <= SIEPortData; + next_TxByteOutCtrl <= `DATA_STREAM; + next_rstCRC <= 1'b1; + end + `RES_ST_CHK_FIN: + begin + next_USBWireWEn <= 1'b0; + if (resumeCnt == `HOST_TX_RESUME_TIME) + NextState_SIETx <= `RES_ST_W_RDY1; + else + NextState_SIETx <= `RES_ST_DELAY; + end + `RES_ST_SND_J_1: + begin + next_USBWireWEn <= 1'b0; + NextState_SIETx <= `RES_ST_W_RDY4; + end + `RES_ST_SND_J_2: + begin + next_USBWireWEn <= 1'b0; + next_USBWireReq <= 1'b0; + NextState_SIETx <= `STX_WAIT_BYTE; + next_USBWireFullSpeedRate <= fullSpeedRateIn; + end + `RES_ST_SND_SE0_1: + begin + next_USBWireWEn <= 1'b0; + NextState_SIETx <= `RES_ST_W_RDY2; + end + `RES_ST_SND_SE0_2: + begin + next_USBWireWEn <= 1'b0; + NextState_SIETx <= `RES_ST_W_RDY3; + end + `RES_ST_WAIT_GNT: + if (USBWireGnt == 1'b1) + NextState_SIETx <= `RES_ST_WAIT_RDY; + `RES_ST_WAIT_RDY: + if (USBWireRdy == 1'b1) + begin + NextState_SIETx <= `RES_ST_CHK_FIN; + next_USBWireData <= KBit; + next_USBWireCtrl <= `DRIVE; + next_USBWireWEn <= 1'b1; + next_resumeCnt <= resumeCnt + 1'b1; + end + `RES_ST_W_RDY1: + if (USBWireRdy == 1'b1) + begin + NextState_SIETx <= `RES_ST_SND_SE0_1; + next_USBWireData <= `SE0; + next_USBWireCtrl <= `DRIVE; + next_USBWireWEn <= 1'b1; + end + `RES_ST_DELAY: + NextState_SIETx <= `RES_ST_WAIT_RDY; + `RES_ST_W_RDY2: + if (USBWireRdy == 1'b1) + begin + NextState_SIETx <= `RES_ST_SND_SE0_2; + next_USBWireData <= `SE0; + next_USBWireCtrl <= `DRIVE; + next_USBWireWEn <= 1'b1; + end + `RES_ST_W_RDY3: + if (USBWireRdy == 1'b1) + begin + NextState_SIETx <= `RES_ST_SND_J_1; + next_USBWireData <= JBit; + next_USBWireCtrl <= `DRIVE; + next_USBWireWEn <= 1'b1; + end + `RES_ST_W_RDY4: + if (USBWireRdy == 1'b1) + begin + NextState_SIETx <= `RES_ST_SND_J_2; + next_USBWireData <= JBit; + next_USBWireCtrl <= `TRI_STATE; + next_USBWireWEn <= 1'b1; + end + `TX_LS_EOP_WAIT_GNT1: + if (USBWireGnt == 1'b1) + NextState_SIETx <= `TX_LS_EOP_W_RDY1; + `TX_LS_EOP_SND_SE0_2: + begin + next_USBWireWEn <= 1'b0; + NextState_SIETx <= `TX_LS_EOP_W_RDY3; + end + `TX_LS_EOP_SND_SE0_1: + begin + next_USBWireWEn <= 1'b0; + NextState_SIETx <= `TX_LS_EOP_W_RDY2; + end + `TX_LS_EOP_W_RDY1: + if (USBWireRdy == 1'b1) + begin + NextState_SIETx <= `TX_LS_EOP_SND_SE0_1; + next_USBWireData <= `SE0; + next_USBWireCtrl <= `DRIVE; + next_USBWireWEn <= 1'b1; + end + `TX_LS_EOP_SND_J: + begin + next_USBWireWEn <= 1'b0; + next_USBWireReq <= 1'b0; + NextState_SIETx <= `STX_WAIT_BYTE; + end + `TX_LS_EOP_W_RDY2: + if (USBWireRdy == 1'b1) + begin + NextState_SIETx <= `TX_LS_EOP_SND_SE0_2; + next_USBWireData <= `SE0; + next_USBWireCtrl <= `DRIVE; + next_USBWireWEn <= 1'b1; + end + `TX_LS_EOP_W_RDY3: + if (USBWireRdy == 1'b1) + begin + NextState_SIETx <= `TX_LS_EOP_SND_J; + next_USBWireData <= JBit; + next_USBWireCtrl <= `DRIVE; + next_USBWireWEn <= 1'b1; + end + endcase +end + +//---------------------------------- +// Current State Logic (sequential) +//---------------------------------- +always @ (posedge clk) +begin : SIETx_CurrentState + if (rst) + CurrState_SIETx <= `START_SIETX; + else + CurrState_SIETx <= NextState_SIETx; +end + +//---------------------------------- +// Registered outputs logic +//---------------------------------- +always @ (posedge clk) +begin : SIETx_RegOutput + if (rst) + begin + SIEPortData <= 8'h00; + SIEPortCtrl <= 8'h00; + i <= 3'h0; + resumeCnt <= 16'h0000; + processTxByteWEn <= 1'b0; + TxByteOut <= 8'h00; + TxByteOutCtrl <= 8'h00; + USBWireData <= 2'b00; + USBWireCtrl <= `TRI_STATE; + USBWireReq <= 1'b0; + USBWireWEn <= 1'b0; + rstCRC <= 1'b0; + CRCData <= 8'h00; + CRC5En <= 1'b0; + CRC5_8Bit <= 1'b0; + CRC16En <= 1'b0; + SIEPortTxRdy <= 1'b0; + TxByteOutFullSpeedRate <= 1'b0; + USBWireFullSpeedRate <= 1'b0; + end + else + begin + SIEPortData <= next_SIEPortData; + SIEPortCtrl <= next_SIEPortCtrl; + i <= next_i; + resumeCnt <= next_resumeCnt; + processTxByteWEn <= next_processTxByteWEn; + TxByteOut <= next_TxByteOut; + TxByteOutCtrl <= next_TxByteOutCtrl; + USBWireData <= next_USBWireData; + USBWireCtrl <= next_USBWireCtrl; + USBWireReq <= next_USBWireReq; + USBWireWEn <= next_USBWireWEn; + rstCRC <= next_rstCRC; + CRCData <= next_CRCData; + CRC5En <= next_CRC5En; + CRC5_8Bit <= next_CRC5_8Bit; + CRC16En <= next_CRC16En; + SIEPortTxRdy <= next_SIEPortTxRdy; + TxByteOutFullSpeedRate <= next_TxByteOutFullSpeedRate; + USBWireFullSpeedRate <= next_USBWireFullSpeedRate; + end +end + +endmodule \ No newline at end of file Index: Actel/usbDeviceActelTop/hdl/endpMux.v =================================================================== --- Actel/usbDeviceActelTop/hdl/endpMux.v (nonexistent) +++ Actel/usbDeviceActelTop/hdl/endpMux.v (revision 40) @@ -0,0 +1,259 @@ +////////////////////////////////////////////////////////////////////// +//// //// +//// endpMux.v //// +//// //// +//// This file is part of the usbhostslave opencores effort. +//// //// +//// //// +//// Module Description: //// +//// +//// //// +//// To Do: //// +//// +//// //// +//// Author(s): //// +//// - Steve Fielding, sfielding@base2designs.com //// +//// //// +////////////////////////////////////////////////////////////////////// +//// //// +//// Copyright (C) 2004 Steve Fielding and OPENCORES.ORG //// +//// //// +//// This source file may be used and distributed without //// +//// restriction provided that this copyright statement is not //// +//// removed from the file and that any derivative work contains //// +//// the original copyright notice and the associated disclaimer. //// +//// //// +//// This source file is free software; you can redistribute it //// +//// and/or modify it under the terms of the GNU Lesser General //// +//// Public License as published by the Free Software Foundation; //// +//// either version 2.1 of the License, or (at your option) any //// +//// later version. //// +//// //// +//// This source is distributed in the hope that it will be //// +//// useful, but WITHOUT ANY WARRANTY; without even the implied //// +//// warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR //// +//// PURPOSE. See the GNU Lesser General Public License for more //// +//// details. //// +//// //// +//// You should have received a copy of the GNU Lesser General //// +//// Public License along with this source; if not, download it //// +//// from //// +//// //// +////////////////////////////////////////////////////////////////////// +// +`include "timescale.v" +`include "usbSlaveControl_h.v" + +module endpMux ( + clk, + rst, + currEndP, + NAKSent, + stallSent, + CRCError, + bitStuffError, + RxOverflow, + RxTimeOut, + dataSequence, + ACKRxed, + transType, + transTypeNAK, + endPControlReg, + clrEPRdy, + endPMuxErrorsWEn, + endP0ControlReg, + endP1ControlReg, + endP2ControlReg, + endP3ControlReg, + endP0StatusReg, + endP1StatusReg, + endP2StatusReg, + endP3StatusReg, + endP0TransTypeReg, + endP1TransTypeReg, + endP2TransTypeReg, + endP3TransTypeReg, + endP0NAKTransTypeReg, + endP1NAKTransTypeReg, + endP2NAKTransTypeReg, + endP3NAKTransTypeReg, + clrEP0Rdy, + clrEP1Rdy, + clrEP2Rdy, + clrEP3Rdy); + + +input clk; +input rst; +input [3:0] currEndP; +input NAKSent; +input stallSent; +input CRCError; +input bitStuffError; +input RxOverflow; +input RxTimeOut; +input dataSequence; +input ACKRxed; +input [1:0] transType; +input [1:0] transTypeNAK; +output [4:0] endPControlReg; +input clrEPRdy; +input endPMuxErrorsWEn; +input [4:0] endP0ControlReg; +input [4:0] endP1ControlReg; +input [4:0] endP2ControlReg; +input [4:0] endP3ControlReg; +output [7:0] endP0StatusReg; +output [7:0] endP1StatusReg; +output [7:0] endP2StatusReg; +output [7:0] endP3StatusReg; +output [1:0] endP0TransTypeReg; +output [1:0] endP1TransTypeReg; +output [1:0] endP2TransTypeReg; +output [1:0] endP3TransTypeReg; +output [1:0] endP0NAKTransTypeReg; +output [1:0] endP1NAKTransTypeReg; +output [1:0] endP2NAKTransTypeReg; +output [1:0] endP3NAKTransTypeReg; +output clrEP0Rdy; +output clrEP1Rdy; +output clrEP2Rdy; +output clrEP3Rdy; + +wire clk; +wire rst; +wire [3:0] currEndP; +wire NAKSent; +wire stallSent; +wire CRCError; +wire bitStuffError; +wire RxOverflow; +wire RxTimeOut; +wire dataSequence; +wire ACKRxed; +wire [1:0] transType; +wire [1:0] transTypeNAK; +reg [4:0] endPControlReg; +wire clrEPRdy; +wire endPMuxErrorsWEn; +wire [4:0] endP0ControlReg; +wire [4:0] endP1ControlReg; +wire [4:0] endP2ControlReg; +wire [4:0] endP3ControlReg; +reg [7:0] endP0StatusReg; +reg [7:0] endP1StatusReg; +reg [7:0] endP2StatusReg; +reg [7:0] endP3StatusReg; +reg [1:0] endP0TransTypeReg; +reg [1:0] endP1TransTypeReg; +reg [1:0] endP2TransTypeReg; +reg [1:0] endP3TransTypeReg; +reg [1:0] endP0NAKTransTypeReg; +reg [1:0] endP1NAKTransTypeReg; +reg [1:0] endP2NAKTransTypeReg; +reg [1:0] endP3NAKTransTypeReg; +reg clrEP0Rdy; +reg clrEP1Rdy; +reg clrEP2Rdy; +reg clrEP3Rdy; + +//internal wires and regs +reg [7:0] endPStatusCombine; + +//mux endPControlReg and clrEPRdy +always @(posedge clk) +begin + case (currEndP[1:0]) + 2'b00: begin + endPControlReg <= endP0ControlReg; + clrEP0Rdy <= clrEPRdy; + end + 2'b01: begin + endPControlReg <= endP1ControlReg; + clrEP1Rdy <= clrEPRdy; + end + 2'b10: begin + endPControlReg <= endP2ControlReg; + clrEP2Rdy <= clrEPRdy; + end + 2'b11: begin + endPControlReg <= endP3ControlReg; + clrEP3Rdy <= clrEPRdy; + end + endcase +end + +//mux endPNAKTransType, endPTransType, endPStatusReg +//If there was a NAK sent then set the NAKSent bit, and leave the other status reg bits untouched. +//else update the entire status reg +always @(posedge clk) +begin + if (rst) begin + endP0NAKTransTypeReg <= 2'b00; + endP1NAKTransTypeReg <= 2'b00; + endP2NAKTransTypeReg <= 2'b00; + endP3NAKTransTypeReg <= 2'b00; + endP0TransTypeReg <= 2'b00; + endP1TransTypeReg <= 2'b00; + endP2TransTypeReg <= 2'b00; + endP3TransTypeReg <= 2'b00; + endP0StatusReg <= 4'h0; + endP1StatusReg <= 4'h0; + endP2StatusReg <= 4'h0; + endP3StatusReg <= 4'h0; + end + else begin + if (endPMuxErrorsWEn == 1'b1) begin + if (NAKSent == 1'b1) begin + case (currEndP[1:0]) + 2'b00: begin + endP0NAKTransTypeReg <= transTypeNAK; + endP0StatusReg <= endP0StatusReg | `NAK_SET_MASK; + end + 2'b01: begin + endP1NAKTransTypeReg <= transTypeNAK; + endP1StatusReg <= endP1StatusReg | `NAK_SET_MASK; + end + 2'b10: begin + endP2NAKTransTypeReg <= transTypeNAK; + endP2StatusReg <= endP2StatusReg | `NAK_SET_MASK; + end + 2'b11: begin + endP3NAKTransTypeReg <= transTypeNAK; + endP3StatusReg <= endP3StatusReg | `NAK_SET_MASK; + end + endcase + end + else begin + case (currEndP[1:0]) + 2'b00: begin + endP0TransTypeReg <= transType; + endP0StatusReg <= endPStatusCombine; + end + 2'b01: begin + endP1TransTypeReg <= transType; + endP1StatusReg <= endPStatusCombine; + end + 2'b10: begin + endP2TransTypeReg <= transType; + endP2StatusReg <= endPStatusCombine; + end + 2'b11: begin + endP3TransTypeReg <= transType; + endP3StatusReg <= endPStatusCombine; + end + endcase + end + end + end +end + + +//combine status bits into a single word +always @(dataSequence or ACKRxed or stallSent or RxTimeOut or RxOverflow or bitStuffError or CRCError) +begin + endPStatusCombine <= {dataSequence, ACKRxed, stallSent, 1'b0, RxTimeOut, RxOverflow, bitStuffError, CRCError}; +end + + +endmodule Index: Actel/usbDeviceActelTop/hdl/pll_48MHz.v =================================================================== --- Actel/usbDeviceActelTop/hdl/pll_48MHz.v (nonexistent) +++ Actel/usbDeviceActelTop/hdl/pll_48MHz.v (revision 40) @@ -0,0 +1,278 @@ +// megafunction wizard: %ALTPLL% +// GENERATION: STANDARD +// VERSION: WM1.0 +// MODULE: altpll + +// ============================================================ +// File Name: pll_48MHz.v +// Megafunction Name(s): +// altpll +// +// Simulation Library Files(s): +// altera_mf +// ============================================================ +// ************************************************************ +// THIS IS A WIZARD-GENERATED FILE. DO NOT EDIT THIS FILE! +// +// 7.2 Build 203 02/05/2008 SP 2 SJ Web Edition +// ************************************************************ + + +//Copyright (C) 1991-2007 Altera Corporation +//Your use of Altera Corporation's design tools, logic functions +//and other software and tools, and its AMPP partner logic +//functions, and any output files from any of the foregoing +//(including device programming or simulation files), and any +//associated documentation or information are expressly subject +//to the terms and conditions of the Altera Program License +//Subscription Agreement, Altera MegaCore Function License +//Agreement, or other applicable license agreement, including, +//without limitation, that your use is for the sole purpose of +//programming logic devices manufactured by Altera and sold by +//Altera or its authorized distributors. Please refer to the +//applicable agreement for further details. + + +// synopsys translate_off +`timescale 1 ps / 1 ps +// synopsys translate_on +module pll_48MHz ( + inclk0, + locked); + + input inclk0; + output locked; + + wire sub_wire0; + wire [0:0] sub_wire3 = 1'h0; + wire locked = sub_wire0; + wire sub_wire1 = inclk0; + wire [1:0] sub_wire2 = {sub_wire3, sub_wire1}; + + altpll altpll_component ( + .inclk (sub_wire2), + .locked (sub_wire0), + .activeclock (), + .areset (1'b0), + .clk (), + .clkbad (), + .clkena ({6{1'b1}}), + .clkloss (), + .clkswitch (1'b0), + .configupdate (1'b0), + .enable0 (), + .enable1 (), + .extclk (), + .extclkena ({4{1'b1}}), + .fbin (1'b1), + .fbmimicbidir (), + .fbout (), + .pfdena (1'b1), + .phasecounterselect ({4{1'b1}}), + .phasedone (), + .phasestep (1'b1), + .phaseupdown (1'b1), + .pllena (1'b1), + .scanaclr (1'b0), + .scanclk (1'b0), + .scanclkena (1'b1), + .scandata (1'b0), + .scandataout (), + .scandone (), + .scanread (1'b0), + .scanwrite (1'b0), + .sclkout0 (), + .sclkout1 (), + .vcooverrange (), + .vcounderrange ()); + defparam + altpll_component.gate_lock_signal = "NO", + altpll_component.inclk0_input_frequency = 20833, + altpll_component.intended_device_family = "Cyclone II", + altpll_component.invalid_lock_multiplier = 5, + altpll_component.lpm_hint = "CBX_MODULE_PREFIX=pll_48MHz", + altpll_component.lpm_type = "altpll", + altpll_component.operation_mode = "NO_COMPENSATION", + altpll_component.port_activeclock = "PORT_UNUSED", + altpll_component.port_areset = "PORT_UNUSED", + altpll_component.port_clkbad0 = "PORT_UNUSED", + altpll_component.port_clkbad1 = "PORT_UNUSED", + altpll_component.port_clkloss = "PORT_UNUSED", + altpll_component.port_clkswitch = "PORT_UNUSED", + altpll_component.port_configupdate = "PORT_UNUSED", + altpll_component.port_fbin = "PORT_UNUSED", + altpll_component.port_inclk0 = "PORT_USED", + altpll_component.port_inclk1 = "PORT_UNUSED", + altpll_component.port_locked = "PORT_USED", + altpll_component.port_pfdena = "PORT_UNUSED", + altpll_component.port_phasecounterselect = "PORT_UNUSED", + altpll_component.port_phasedone = "PORT_UNUSED", + altpll_component.port_phasestep = "PORT_UNUSED", + altpll_component.port_phaseupdown = "PORT_UNUSED", + altpll_component.port_pllena = "PORT_UNUSED", + altpll_component.port_scanaclr = "PORT_UNUSED", + altpll_component.port_scanclk = "PORT_UNUSED", + altpll_component.port_scanclkena = "PORT_UNUSED", + altpll_component.port_scandata = "PORT_UNUSED", + altpll_component.port_scandataout = "PORT_UNUSED", + altpll_component.port_scandone = "PORT_UNUSED", + altpll_component.port_scanread = "PORT_UNUSED", + altpll_component.port_scanwrite = "PORT_UNUSED", + altpll_component.port_clk0 = "PORT_UNUSED", + altpll_component.port_clk1 = "PORT_UNUSED", + altpll_component.port_clk2 = "PORT_UNUSED", + altpll_component.port_clk3 = "PORT_UNUSED", + altpll_component.port_clk4 = "PORT_UNUSED", + altpll_component.port_clk5 = "PORT_UNUSED", + altpll_component.port_clkena0 = "PORT_UNUSED", + altpll_component.port_clkena1 = "PORT_UNUSED", + altpll_component.port_clkena2 = "PORT_UNUSED", + altpll_component.port_clkena3 = "PORT_UNUSED", + altpll_component.port_clkena4 = "PORT_UNUSED", + altpll_component.port_clkena5 = "PORT_UNUSED", + altpll_component.port_extclk0 = "PORT_UNUSED", + altpll_component.port_extclk1 = "PORT_UNUSED", + altpll_component.port_extclk2 = "PORT_UNUSED", + altpll_component.port_extclk3 = "PORT_UNUSED", + altpll_component.valid_lock_multiplier = 1; + + +endmodule + +// ============================================================ +// CNX file retrieval info +// ============================================================ +// Retrieval info: PRIVATE: ACTIVECLK_CHECK STRING "0" +// Retrieval info: PRIVATE: BANDWIDTH STRING "1.000" +// Retrieval info: PRIVATE: BANDWIDTH_FEATURE_ENABLED STRING "0" +// Retrieval info: PRIVATE: BANDWIDTH_FREQ_UNIT STRING "MHz" +// Retrieval info: PRIVATE: BANDWIDTH_PRESET STRING "Low" +// Retrieval info: PRIVATE: BANDWIDTH_USE_AUTO STRING "1" +// Retrieval info: PRIVATE: BANDWIDTH_USE_CUSTOM STRING "0" +// Retrieval info: PRIVATE: BANDWIDTH_USE_PRESET STRING "0" +// Retrieval info: PRIVATE: CLKBAD_SWITCHOVER_CHECK STRING "0" +// Retrieval info: PRIVATE: CLKLOSS_CHECK STRING "0" +// Retrieval info: PRIVATE: CLKSWITCH_CHECK STRING "1" +// Retrieval info: PRIVATE: CNX_NO_COMPENSATE_RADIO STRING "1" +// Retrieval info: PRIVATE: CREATE_CLKBAD_CHECK STRING "0" +// Retrieval info: PRIVATE: CREATE_INCLK1_CHECK STRING "0" +// Retrieval info: PRIVATE: CUR_DEDICATED_CLK STRING "c0" +// Retrieval info: PRIVATE: CUR_FBIN_CLK STRING "e0" +// Retrieval info: PRIVATE: DEVICE_SPEED_GRADE STRING "8" +// Retrieval info: PRIVATE: EXPLICIT_SWITCHOVER_COUNTER STRING "0" +// Retrieval info: PRIVATE: EXT_FEEDBACK_RADIO STRING "0" +// Retrieval info: PRIVATE: GLOCKED_COUNTER_EDIT_CHANGED STRING "1" +// Retrieval info: PRIVATE: GLOCKED_FEATURE_ENABLED STRING "1" +// Retrieval info: PRIVATE: GLOCKED_MODE_CHECK STRING "0" +// Retrieval info: PRIVATE: GLOCK_COUNTER_EDIT NUMERIC "1048575" +// Retrieval info: PRIVATE: HAS_MANUAL_SWITCHOVER STRING "1" +// Retrieval info: PRIVATE: INCLK0_FREQ_EDIT STRING "48.000" +// Retrieval info: PRIVATE: INCLK0_FREQ_UNIT_COMBO STRING "MHz" +// Retrieval info: PRIVATE: INCLK1_FREQ_EDIT STRING "100.000" +// Retrieval info: PRIVATE: INCLK1_FREQ_EDIT_CHANGED STRING "1" +// Retrieval info: PRIVATE: INCLK1_FREQ_UNIT_CHANGED STRING "1" +// Retrieval info: PRIVATE: INCLK1_FREQ_UNIT_COMBO STRING "MHz" +// Retrieval info: PRIVATE: INTENDED_DEVICE_FAMILY STRING "Cyclone II" +// Retrieval info: PRIVATE: INT_FEEDBACK__MODE_RADIO STRING "1" +// Retrieval info: PRIVATE: LOCKED_OUTPUT_CHECK STRING "1" +// Retrieval info: PRIVATE: LONG_SCAN_RADIO STRING "1" +// Retrieval info: PRIVATE: LVDS_MODE_DATA_RATE STRING "Not Available" +// Retrieval info: PRIVATE: LVDS_MODE_DATA_RATE_DIRTY NUMERIC "0" +// Retrieval info: PRIVATE: NORMAL_MODE_RADIO STRING "0" +// Retrieval info: PRIVATE: PHASE_RECONFIG_FEATURE_ENABLED STRING "0" +// Retrieval info: PRIVATE: PHASE_RECONFIG_INPUTS_CHECK STRING "0" +// Retrieval info: PRIVATE: PHASE_SHIFT_STEP_ENABLED_CHECK STRING "0" +// Retrieval info: PRIVATE: PLL_ADVANCED_PARAM_CHECK STRING "0" +// Retrieval info: PRIVATE: PLL_ARESET_CHECK STRING "0" +// Retrieval info: PRIVATE: PLL_AUTOPLL_CHECK NUMERIC "1" +// Retrieval info: PRIVATE: PLL_ENA_CHECK STRING "0" +// Retrieval info: PRIVATE: PLL_ENHPLL_CHECK NUMERIC "0" +// Retrieval info: PRIVATE: PLL_FASTPLL_CHECK NUMERIC "0" +// Retrieval info: PRIVATE: PLL_FBMIMIC_CHECK STRING "0" +// Retrieval info: PRIVATE: PLL_LVDS_PLL_CHECK NUMERIC "0" +// Retrieval info: PRIVATE: PLL_PFDENA_CHECK STRING "0" +// Retrieval info: PRIVATE: PLL_TARGET_HARCOPY_CHECK NUMERIC "0" +// Retrieval info: PRIVATE: PRIMARY_CLK_COMBO STRING "inclk0" +// Retrieval info: PRIVATE: RECONFIG_FILE STRING "pll_48MHz.mif" +// Retrieval info: PRIVATE: SACN_INPUTS_CHECK STRING "0" +// Retrieval info: PRIVATE: SCAN_FEATURE_ENABLED STRING "0" +// Retrieval info: PRIVATE: SELF_RESET_LOCK_LOSS STRING "0" +// Retrieval info: PRIVATE: SHORT_SCAN_RADIO STRING "0" +// Retrieval info: PRIVATE: SPREAD_FEATURE_ENABLED STRING "0" +// Retrieval info: PRIVATE: SPREAD_FREQ STRING "50.000" +// Retrieval info: PRIVATE: SPREAD_FREQ_UNIT STRING "KHz" +// Retrieval info: PRIVATE: SPREAD_PERCENT STRING "0.500" +// Retrieval info: PRIVATE: SPREAD_USE STRING "0" +// Retrieval info: PRIVATE: SRC_SYNCH_COMP_RADIO STRING "0" +// Retrieval info: PRIVATE: SWITCHOVER_COUNT_EDIT NUMERIC "1" +// Retrieval info: PRIVATE: SWITCHOVER_FEATURE_ENABLED STRING "1" +// Retrieval info: PRIVATE: SYNTH_WRAPPER_GEN_POSTFIX STRING "0" +// Retrieval info: PRIVATE: USE_MIL_SPEED_GRADE NUMERIC "0" +// Retrieval info: PRIVATE: ZERO_DELAY_RADIO STRING "0" +// Retrieval info: LIBRARY: altera_mf altera_mf.altera_mf_components.all +// Retrieval info: CONSTANT: GATE_LOCK_SIGNAL STRING "NO" +// Retrieval info: CONSTANT: INCLK0_INPUT_FREQUENCY NUMERIC "20833" +// Retrieval info: CONSTANT: INTENDED_DEVICE_FAMILY STRING "Cyclone II" +// Retrieval info: CONSTANT: INVALID_LOCK_MULTIPLIER NUMERIC "5" +// Retrieval info: CONSTANT: LPM_TYPE STRING "altpll" +// Retrieval info: CONSTANT: OPERATION_MODE STRING "NO_COMPENSATION" +// Retrieval info: CONSTANT: PORT_ACTIVECLOCK STRING "PORT_UNUSED" +// Retrieval info: CONSTANT: PORT_ARESET STRING "PORT_UNUSED" +// Retrieval info: CONSTANT: PORT_CLKBAD0 STRING "PORT_UNUSED" +// Retrieval info: CONSTANT: PORT_CLKBAD1 STRING "PORT_UNUSED" +// Retrieval info: CONSTANT: PORT_CLKLOSS STRING "PORT_UNUSED" +// Retrieval info: CONSTANT: PORT_CLKSWITCH STRING "PORT_UNUSED" +// Retrieval info: CONSTANT: PORT_CONFIGUPDATE STRING "PORT_UNUSED" +// Retrieval info: CONSTANT: PORT_FBIN STRING "PORT_UNUSED" +// Retrieval info: CONSTANT: PORT_INCLK0 STRING "PORT_USED" +// Retrieval info: CONSTANT: PORT_INCLK1 STRING "PORT_UNUSED" +// Retrieval info: CONSTANT: PORT_LOCKED STRING "PORT_USED" +// Retrieval info: CONSTANT: PORT_PFDENA STRING "PORT_UNUSED" +// Retrieval info: CONSTANT: PORT_PHASECOUNTERSELECT STRING "PORT_UNUSED" +// Retrieval info: CONSTANT: PORT_PHASEDONE STRING "PORT_UNUSED" +// Retrieval info: CONSTANT: PORT_PHASESTEP STRING "PORT_UNUSED" +// Retrieval info: CONSTANT: PORT_PHASEUPDOWN STRING "PORT_UNUSED" +// Retrieval info: CONSTANT: PORT_PLLENA STRING "PORT_UNUSED" +// Retrieval info: CONSTANT: PORT_SCANACLR STRING "PORT_UNUSED" +// Retrieval info: CONSTANT: PORT_SCANCLK STRING "PORT_UNUSED" +// Retrieval info: CONSTANT: PORT_SCANCLKENA STRING "PORT_UNUSED" +// Retrieval info: CONSTANT: PORT_SCANDATA STRING "PORT_UNUSED" +// Retrieval info: CONSTANT: PORT_SCANDATAOUT STRING "PORT_UNUSED" +// Retrieval info: CONSTANT: PORT_SCANDONE STRING "PORT_UNUSED" +// Retrieval info: CONSTANT: PORT_SCANREAD STRING "PORT_UNUSED" +// Retrieval info: CONSTANT: PORT_SCANWRITE STRING "PORT_UNUSED" +// Retrieval info: CONSTANT: PORT_clk0 STRING "PORT_UNUSED" +// Retrieval info: CONSTANT: PORT_clk1 STRING "PORT_UNUSED" +// Retrieval info: CONSTANT: PORT_clk2 STRING "PORT_UNUSED" +// Retrieval info: CONSTANT: PORT_clk3 STRING "PORT_UNUSED" +// Retrieval info: CONSTANT: PORT_clk4 STRING "PORT_UNUSED" +// Retrieval info: CONSTANT: PORT_clk5 STRING "PORT_UNUSED" +// Retrieval info: CONSTANT: PORT_clkena0 STRING "PORT_UNUSED" +// Retrieval info: CONSTANT: PORT_clkena1 STRING "PORT_UNUSED" +// Retrieval info: CONSTANT: PORT_clkena2 STRING "PORT_UNUSED" +// Retrieval info: CONSTANT: PORT_clkena3 STRING "PORT_UNUSED" +// Retrieval info: CONSTANT: PORT_clkena4 STRING "PORT_UNUSED" +// Retrieval info: CONSTANT: PORT_clkena5 STRING "PORT_UNUSED" +// Retrieval info: CONSTANT: PORT_extclk0 STRING "PORT_UNUSED" +// Retrieval info: CONSTANT: PORT_extclk1 STRING "PORT_UNUSED" +// Retrieval info: CONSTANT: PORT_extclk2 STRING "PORT_UNUSED" +// Retrieval info: CONSTANT: PORT_extclk3 STRING "PORT_UNUSED" +// Retrieval info: CONSTANT: VALID_LOCK_MULTIPLIER NUMERIC "1" +// Retrieval info: USED_PORT: @clk 0 0 6 0 OUTPUT_CLK_EXT VCC "@clk[5..0]" +// Retrieval info: USED_PORT: @extclk 0 0 4 0 OUTPUT_CLK_EXT VCC "@extclk[3..0]" +// Retrieval info: USED_PORT: inclk0 0 0 0 0 INPUT_CLK_EXT GND "inclk0" +// Retrieval info: USED_PORT: locked 0 0 0 0 OUTPUT GND "locked" +// Retrieval info: CONNECT: locked 0 0 0 0 @locked 0 0 0 0 +// Retrieval info: CONNECT: @inclk 0 0 1 0 inclk0 0 0 0 0 +// Retrieval info: CONNECT: @inclk 0 0 1 1 GND 0 0 0 0 +// Retrieval info: GEN_FILE: TYPE_NORMAL pll_48MHz.v TRUE FALSE +// Retrieval info: GEN_FILE: TYPE_NORMAL pll_48MHz.ppf TRUE FALSE +// Retrieval info: GEN_FILE: TYPE_NORMAL pll_48MHz.inc FALSE FALSE +// Retrieval info: GEN_FILE: TYPE_NORMAL pll_48MHz.cmp FALSE FALSE +// Retrieval info: GEN_FILE: TYPE_NORMAL pll_48MHz.bsf FALSE FALSE +// Retrieval info: GEN_FILE: TYPE_NORMAL pll_48MHz_inst.v TRUE FALSE +// Retrieval info: GEN_FILE: TYPE_NORMAL pll_48MHz_bb.v FALSE FALSE +// Retrieval info: GEN_FILE: TYPE_NORMAL pll_48MHz_waveforms.html TRUE FALSE +// Retrieval info: GEN_FILE: TYPE_NORMAL pll_48MHz_wave*.jpg FALSE FALSE +// Retrieval info: LIB_FILE: altera_mf +// Retrieval info: CBX_MODULE_PREFIX: ON Index: Actel/usbDeviceActelTop/hdl/EP0.v =================================================================== --- Actel/usbDeviceActelTop/hdl/EP0.v (nonexistent) +++ Actel/usbDeviceActelTop/hdl/EP0.v (revision 40) @@ -0,0 +1,869 @@ + +////////////////////////////////////////////////////////////////////// +//// //// +//// EP0.v //// +//// //// +//// This file is part of the usbHostSlave opencores effort. +//// //// +//// //// +//// Module Description: //// +//// Implements EP0 control endpoint +//// Responds to 8-byte SETUP packets +//// of type GET_STATUS, GET_DESCRIPTOR and +//// SET_ADDRESS +//// //// +//// To Do: //// +//// +//// //// +//// Author(s): //// +//// - Steve Fielding, sfielding@base2designs.com //// +//// //// +////////////////////////////////////////////////////////////////////// +//// //// +//// Copyright (C) 2008 Steve Fielding and OPENCORES.ORG //// +//// //// +//// This source file may be used and distributed without //// +//// restriction provided that this copyright statement is not //// +//// removed from the file and that any derivative work contains //// +//// the original copyright notice and the associated disclaimer. //// +//// //// +//// This source file is free software; you can redistribute it //// +//// and/or modify it under the terms of the GNU Lesser General //// +//// Public License as published by the Free Software Foundation; //// +//// either version 2.1 of the License, or (at your option) any //// +//// later version. //// +//// //// +//// This source is distributed in the hope that it will be //// +//// useful, but WITHOUT ANY WARRANTY; without even the implied //// +//// warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR //// +//// PURPOSE. See the GNU Lesser General Public License for more //// +//// details. //// +//// //// +//// You should have received a copy of the GNU Lesser General //// +//// Public License along with this source; if not, download it //// +//// from //// +//// //// +////////////////////////////////////////////////////////////////////// +// +`include "timescale.v" +`include "usbHostSlaveReg_define.v" +`include "usbDevice_define.v" + + +module EP0 (clk, initComplete, memAddr, memData, memRdEn, rst, wb_ack, wb_addr, wb_data_i, wb_data_o, wb_stb, wb_we, wbBusGnt, wbBusReq); +input clk; +input [7:0]memData; +input rst; +input wb_ack; +input [7:0]wb_data_i; +input wbBusGnt; +output initComplete; +output [7:0]memAddr; +output memRdEn; +output [7:0]wb_addr; +output [7:0]wb_data_o; +output wb_stb; +output wb_we; +output wbBusReq; + +wire clk; +reg initComplete, next_initComplete; +reg [7:0]memAddr, next_memAddr; +wire [7:0]memData; +reg memRdEn, next_memRdEn; +wire rst; +wire wb_ack; +reg [7:0]wb_addr, next_wb_addr; +wire [7:0]wb_data_i; +reg [7:0]wb_data_o, next_wb_data_o; +reg wb_stb, next_wb_stb; +reg wb_we, next_wb_we; +wire wbBusGnt; +reg wbBusReq, next_wbBusReq; + +// diagram signals declarations +reg bm_req_dir, next_bm_req_dir; +reg [4:0]bm_req_recp, next_bm_req_recp; +reg [1:0]bm_req_type, next_bm_req_type; +reg [7:0]bRequest, next_bRequest; +reg [7:0]cnt, next_cnt; +reg dataSeq, next_dataSeq; +reg [7:0]epStatus, next_epStatus; +reg [7:0]epTransType, next_epTransType; +reg localRst, next_localRst; +reg [15:0]rxDataSize, next_rxDataSize; +reg transDone, next_transDone; +reg [7:0]txDataIndex, next_txDataIndex; +reg [7:0]txDataSize, next_txDataSize; +reg [7:0]txPacketRemSize, next_txPacketRemSize; +reg updateUSBAddress, next_updateUSBAddress; +reg [7:0]USBAddress, next_USBAddress; +reg [15:0]wIndex, next_wIndex; +reg [15:0]wLength, next_wLength; +reg [15:0]wValue, next_wValue; + +// BINARY ENCODED state machine: EP0St +// State codes definitions: +`define INIT_RST 6'b000000 +`define INIT_WT_GNT 6'b000001 +`define INIT_WT_RST 6'b000010 +`define INIT_WT_VBUS 6'b000011 +`define INIT_FIN 6'b000100 +`define DO_TRANS_WT_GNT 6'b000101 +`define DO_TRANS_TX_EMPTY 6'b000110 +`define DO_TRANS_WR_TX_FIFO 6'b000111 +`define DO_TRANS_RD_MEM 6'b001000 +`define DO_TRANS_CHK_TX_DONE 6'b001001 +`define DO_TRANS_TRANS_GO 6'b001010 +`define DO_TRANS_WT_TRANS_DONE_WT_GNT 6'b001011 +`define DO_TRANS_WT_TRANS_DONE_GET_RDY_STS 6'b001100 +`define DO_TRANS_WT_TRANS_DONE_WT_UNGNT 6'b001101 +`define DO_TRANS_WT_TRANS_DONE_CHK_DONE 6'b001110 +`define CHK_TRANS_RD_STAT 6'b001111 +`define CHK_TRANS_WT_GNT 6'b010000 +`define CHK_TRANS_RD_RX_SIZE1 6'b010001 +`define CHK_TRANS_RD_RX_SIZE2 6'b010010 +`define CHK_TRANS_RD_TRANS_TYPE 6'b010011 +`define CHK_TRANS_WT_UNGNT 6'b010100 +`define SETUP_CHK_ERR 6'b010101 +`define SETUP_GET_DATA_DAT1 6'b010110 +`define SETUP_GET_DATA_WT_GNT 6'b010111 +`define SETUP_GET_DATA_DAT2 6'b011000 +`define SETUP_GET_DATA_DAT3 6'b011001 +`define SETUP_GET_DATA_DAT4 6'b011010 +`define SETUP_GET_DATA_DAT6 6'b011011 +`define SETUP_GET_DATA_DAT5 6'b011100 +`define SETUP_GET_DATA_DAT8 6'b011101 +`define SETUP_GET_DATA_DAT7 6'b011110 +`define SETUP_GET_DATA_WT_UNGNT 6'b011111 +`define SETUP_GET_STAT 6'b100000 +`define SETUP_SET_ADDR 6'b100001 +`define SETUP_GET_DESC_S1 6'b100010 +`define SETUP_CHK_MAX_LEN 6'b100011 +`define OUT_CHK_SEQ 6'b100100 +`define IN_CHK_ACK 6'b100101 +`define IN_SET_PTR 6'b100110 +`define IN_SET_ADDR 6'b100111 +`define IN_WT_GNT 6'b101000 +`define IN_WT_UNGNT 6'b101001 +`define DO_TRANS_RX_EMPTY 6'b101010 +`define DO_TRANS_WT_TRANS_DONE_DEL 6'b101011 +`define START 6'b101100 +`define INIT_CONN 6'b101101 +`define INIT_WT_CONN 6'b101110 +`define DO_TRANS_DEL 6'b101111 +`define SETUP_PTR_SET 6'b110000 + +reg [5:0]CurrState_EP0St, NextState_EP0St; + +// Diagram actions (continuous assignments allowed only: assign ...) +// diagram ACTION + + +// Machine: EP0St + +// NextState logic (combinatorial) +always @ (wb_ack or wbBusGnt or cnt or wb_data_i or memData or txDataIndex or txDataSize or transDone or epStatus or epTransType or rxDataSize or bRequest or wValue or wLength or dataSeq or updateUSBAddress or txPacketRemSize or USBAddress or wb_addr or wb_data_o or wb_stb or wb_we or wbBusReq or initComplete or memAddr or memRdEn or bm_req_dir or bm_req_type or bm_req_recp or wIndex or CurrState_EP0St) +begin + NextState_EP0St <= CurrState_EP0St; + // Set default values for outputs and signals + next_wb_addr <= wb_addr; + next_wb_data_o <= wb_data_o; + next_wb_stb <= wb_stb; + next_wb_we <= wb_we; + next_cnt <= cnt; + next_wbBusReq <= wbBusReq; + next_initComplete <= initComplete; + next_memAddr <= memAddr; + next_memRdEn <= memRdEn; + next_txDataSize <= txDataSize; + next_txDataIndex <= txDataIndex; + next_transDone <= transDone; + next_epStatus <= epStatus; + next_rxDataSize <= rxDataSize; + next_epTransType <= epTransType; + next_bm_req_dir <= bm_req_dir; + next_bm_req_type <= bm_req_type; + next_bm_req_recp <= bm_req_recp; + next_bRequest <= bRequest; + next_wValue <= wValue; + next_wIndex <= wIndex; + next_wLength <= wLength; + next_txPacketRemSize <= txPacketRemSize; + next_USBAddress <= USBAddress; + next_updateUSBAddress <= updateUSBAddress; + next_dataSeq <= dataSeq; + case (CurrState_EP0St) // synopsys parallel_case full_case + `START: + begin + next_initComplete <= 1'b0; + next_wbBusReq <= 1'b0; + next_wb_addr <= 8'h00; + next_wb_data_o <= 8'h00; + next_wb_stb <= 1'b0; + next_wb_we <= 1'b0; + next_txPacketRemSize <= 8'h00; + next_txDataSize <= 8'h00; + next_txDataIndex <= 8'h00; + next_epTransType <= 8'h00; + next_epStatus <= 8'h00; + next_rxDataSize <= 16'h0000; + next_cnt <= 8'h00; + next_memRdEn <= 1'b0; + next_memAddr <= 8'h00; + next_updateUSBAddress <= 1'b0; + next_transDone <= 1'b0; + next_bm_req_type <= 2'b00; + next_bm_req_dir <= 1'b0; + next_bm_req_recp <= 5'b00000; + next_bRequest <= 8'h00; + next_wLength <= 16'h0000; + next_wIndex <= 16'h0000; + next_wValue <= 16'h0000; + next_dataSeq <= 1'b0; + next_USBAddress <= 8'h00; + NextState_EP0St <= `INIT_WT_GNT; + end + `CHK_TRANS_RD_STAT: + begin + next_wb_addr <= `RA_EP0_STATUS_REG; + next_wb_stb <= 1'b1; + next_wb_we <= 1'b0; + if (wb_ack == 1'b1) + begin + NextState_EP0St <= `CHK_TRANS_RD_RX_SIZE1; + next_wb_stb <= 1'b0; + next_epStatus <= wb_data_i; + end + end + `CHK_TRANS_WT_GNT: + begin + if (wbBusGnt == 1'b1) + begin + NextState_EP0St <= `CHK_TRANS_RD_STAT; + end + end + `CHK_TRANS_RD_RX_SIZE1: + begin + next_wb_addr <= `RA_EP0_RX_FIFO_DATA_COUNT_MSB; + next_wb_stb <= 1'b1; + next_wb_we <= 1'b0; + if (wb_ack == 1'b1) + begin + NextState_EP0St <= `CHK_TRANS_RD_RX_SIZE2; + next_wb_stb <= 1'b0; + next_rxDataSize[15:8] <= wb_data_i; + end + end + `CHK_TRANS_RD_RX_SIZE2: + begin + next_wb_addr <= `RA_EP0_RX_FIFO_DATA_COUNT_LSB; + next_wb_stb <= 1'b1; + next_wb_we <= 1'b0; + if (wb_ack == 1'b1) + begin + NextState_EP0St <= `CHK_TRANS_RD_TRANS_TYPE; + next_wb_stb <= 1'b0; + next_rxDataSize[7:0] <= wb_data_i; + end + end + `CHK_TRANS_RD_TRANS_TYPE: + begin + next_wb_addr <= `RA_EP0_TRANSTYPE_STATUS_REG; + next_wb_stb <= 1'b1; + next_wb_we <= 1'b0; + if (wb_ack == 1'b1) + begin + NextState_EP0St <= `CHK_TRANS_WT_UNGNT; + next_wb_stb <= 1'b0; + next_epTransType <= wb_data_i; + end + end + `CHK_TRANS_WT_UNGNT: + begin + next_wbBusReq <= 1'b0; + if ((wbBusGnt == 1'b0) && ((epStatus & 8'h0f) != 8'h00)) + begin + NextState_EP0St <= `DO_TRANS_WT_GNT; + end + else if ((wbBusGnt == 1'b0) && (epTransType == `SC_SETUP_TRANS)) + begin + NextState_EP0St <= `SETUP_CHK_ERR; + end + else if ((wbBusGnt == 1'b0) && (epTransType == `SC_IN_TRANS)) + begin + NextState_EP0St <= `IN_CHK_ACK; + end + else if ((wbBusGnt == 1'b0) && (epTransType == `SC_OUTDATA_TRANS)) + begin + NextState_EP0St <= `OUT_CHK_SEQ; + end + else if (wbBusGnt == 1'b0) + begin + NextState_EP0St <= `DO_TRANS_WT_GNT; + end + end + `DO_TRANS_WT_GNT: + begin + next_wbBusReq <= 1'b1; + if (wbBusGnt == 1'b1) + begin + NextState_EP0St <= `DO_TRANS_TX_EMPTY; + end + end + `DO_TRANS_TX_EMPTY: + begin + next_wb_addr <= `RA_EP0_TX_FIFO_CONTROL_REG; + next_wb_data_o <= 8'h01; + //force tx fifo empty + next_wb_stb <= 1'b1; + next_wb_we <= 1'b1; + if (wb_ack == 1'b1) + begin + NextState_EP0St <= `DO_TRANS_RX_EMPTY; + next_wb_stb <= 1'b0; + end + end + `DO_TRANS_WR_TX_FIFO: + begin + next_wb_data_o <= memData; + next_wb_addr <= `RA_EP0_TX_FIFO_DATA_REG; + next_wb_stb <= 1'b1; + next_wb_we <= 1'b1; + if (wb_ack == 1'b1) + begin + NextState_EP0St <= `DO_TRANS_CHK_TX_DONE; + next_wb_stb <= 1'b0; + end + end + `DO_TRANS_RD_MEM: + begin + next_memAddr <= txDataIndex; + next_memRdEn <= 1'b1; + next_txDataSize <= txDataSize - 1'b1; + next_txDataIndex <= txDataIndex + 1'b1; + NextState_EP0St <= `DO_TRANS_DEL; + end + `DO_TRANS_CHK_TX_DONE: + begin + if (txDataSize == 8'h00) + begin + NextState_EP0St <= `DO_TRANS_TRANS_GO; + end + else + begin + NextState_EP0St <= `DO_TRANS_RD_MEM; + end + end + `DO_TRANS_TRANS_GO: + begin + next_wb_addr <= `RA_EP0_CONTROL_REG; + if (dataSeq == 1'b1) + next_wb_data_o <= 8'h07; + else + next_wb_data_o <= 8'h03; + next_wb_stb <= 1'b1; + next_wb_we <= 1'b1; + if (wb_ack == 1'b1) + begin + NextState_EP0St <= `DO_TRANS_WT_TRANS_DONE_WT_GNT; + next_wb_stb <= 1'b0; + next_transDone <= 1'b0; + end + end + `DO_TRANS_RX_EMPTY: + begin + next_wb_addr <= `RA_EP0_RX_FIFO_CONTROL_REG; + next_wb_data_o <= 8'h01; + //force rx fifo empty + next_wb_stb <= 1'b1; + next_wb_we <= 1'b1; + if ((wb_ack == 1'b1) && (txDataSize != 8'h00)) + begin + NextState_EP0St <= `DO_TRANS_RD_MEM; + next_wb_stb <= 1'b0; + end + else if (wb_ack == 1'b1) + begin + NextState_EP0St <= `DO_TRANS_TRANS_GO; + next_wb_stb <= 1'b0; + end + end + `DO_TRANS_DEL: + begin + next_memRdEn <= 1'b0; + NextState_EP0St <= `DO_TRANS_WR_TX_FIFO; + end + `DO_TRANS_WT_TRANS_DONE_WT_GNT: + begin + next_wbBusReq <= 1'b1; + if (wbBusGnt == 1'b1) + begin + NextState_EP0St <= `DO_TRANS_WT_TRANS_DONE_GET_RDY_STS; + end + end + `DO_TRANS_WT_TRANS_DONE_GET_RDY_STS: + begin + next_wb_addr <= `RA_EP0_CONTROL_REG; + next_wb_stb <= 1'b1; + next_wb_we <= 1'b0; + if (wb_ack == 1'b1) + begin + NextState_EP0St <= `DO_TRANS_WT_TRANS_DONE_WT_UNGNT; + next_wb_stb <= 1'b0; + next_transDone <= ~wb_data_i[`ENDPOINT_READY_BIT]; + end + end + `DO_TRANS_WT_TRANS_DONE_WT_UNGNT: + begin + next_wbBusReq <= 1'b0; + if (wbBusGnt == 1'b0) + begin + NextState_EP0St <= `DO_TRANS_WT_TRANS_DONE_CHK_DONE; + end + end + `DO_TRANS_WT_TRANS_DONE_CHK_DONE: + begin + if (transDone == 1'b1) + begin + NextState_EP0St <= `CHK_TRANS_WT_GNT; + next_wbBusReq <= 1'b1; + end + else + begin + NextState_EP0St <= `DO_TRANS_WT_TRANS_DONE_DEL; + next_cnt <= 8'h00; + end + end + `DO_TRANS_WT_TRANS_DONE_DEL: + begin + next_cnt <= cnt + 1'b1; + if (cnt == `ONE_USEC_DEL) + begin + NextState_EP0St <= `DO_TRANS_WT_TRANS_DONE_WT_GNT; + end + end + `SETUP_CHK_ERR: + begin + if (rxDataSize != 16'h0008) + begin + NextState_EP0St <= `DO_TRANS_WT_GNT; + end + else + begin + NextState_EP0St <= `SETUP_GET_DATA_WT_GNT; + next_wbBusReq <= 1'b1; + next_txDataSize <= 8'h00; + next_txPacketRemSize <= 8'h00; + //default tx packet size + next_dataSeq <= 1'b1; + next_wb_addr <= `RA_EP0_RX_FIFO_DATA_REG; + next_wb_we <= 1'b0; + end + end + `SETUP_GET_STAT: + begin + if (bm_req_type == 2'b00) begin + next_txPacketRemSize <= 8'h02; + if (bm_req_recp == 5'b00000) + next_txDataIndex <= `ONE_ZERO_STAT_INDEX; + else + next_txDataIndex <= `ZERO_ZERO_STAT_INDEX; + end + else if (bm_req_type == 2'b10) begin + next_txDataIndex <= `VENDOR_DATA_STAT_INDEX; + next_txPacketRemSize <= 8'h02; + end + NextState_EP0St <= `SETUP_CHK_MAX_LEN; + end + `SETUP_SET_ADDR: + begin + if ( (wValue[15:7] == {9{1'b0}}) && (wIndex == 16'h0000) && (wLength == 16'h0000) ) begin + next_USBAddress <= wValue[7:0]; + next_updateUSBAddress <= 1'b1; + end + NextState_EP0St <= `SETUP_CHK_MAX_LEN; + end + `SETUP_CHK_MAX_LEN: + begin + if (txPacketRemSize > wLength) + next_txPacketRemSize <= wLength; + NextState_EP0St <= `SETUP_PTR_SET; + end + `SETUP_PTR_SET: + begin + if (txPacketRemSize > `MAX_RESP_SIZE) begin + next_txDataSize <= `MAX_RESP_SIZE; + next_txPacketRemSize <= txPacketRemSize - `MAX_RESP_SIZE; + end + else begin + next_txDataSize <= txPacketRemSize; + next_txPacketRemSize <= 8'h00; + end + NextState_EP0St <= `DO_TRANS_WT_GNT; + end + `SETUP_GET_DATA_DAT1: + begin + next_wb_stb <= 1'b1; + if (wb_ack == 1'b1) + begin + NextState_EP0St <= `SETUP_GET_DATA_DAT2; + next_wb_stb <= 1'b0; + next_bm_req_dir <= wb_data_i[7]; + next_bm_req_type <= wb_data_i[6:5]; + next_bm_req_recp <= wb_data_i[4:0]; + end + end + `SETUP_GET_DATA_WT_GNT: + begin + if (wbBusGnt == 1'b1) + begin + NextState_EP0St <= `SETUP_GET_DATA_DAT1; + end + end + `SETUP_GET_DATA_DAT2: + begin + next_wb_stb <= 1'b1; + if (wb_ack == 1'b1) + begin + NextState_EP0St <= `SETUP_GET_DATA_DAT3; + next_wb_stb <= 1'b0; + next_bRequest <= wb_data_i; + end + end + `SETUP_GET_DATA_DAT3: + begin + next_wb_stb <= 1'b1; + if (wb_ack == 1'b1) + begin + NextState_EP0St <= `SETUP_GET_DATA_DAT4; + next_wb_stb <= 1'b0; + next_wValue[7:0] <= wb_data_i; + end + end + `SETUP_GET_DATA_DAT4: + begin + next_wb_stb <= 1'b1; + if (wb_ack == 1'b1) + begin + NextState_EP0St <= `SETUP_GET_DATA_DAT5; + next_wb_stb <= 1'b0; + next_wValue[15:8] <= wb_data_i; + end + end + `SETUP_GET_DATA_DAT6: + begin + next_wb_stb <= 1'b1; + if (wb_ack == 1'b1) + begin + NextState_EP0St <= `SETUP_GET_DATA_DAT7; + next_wb_stb <= 1'b0; + next_wIndex[15:8] <= wb_data_i; + end + end + `SETUP_GET_DATA_DAT5: + begin + next_wb_stb <= 1'b1; + if (wb_ack == 1'b1) + begin + NextState_EP0St <= `SETUP_GET_DATA_DAT6; + next_wb_stb <= 1'b0; + next_wIndex[7:0] <= wb_data_i; + end + end + `SETUP_GET_DATA_DAT8: + begin + next_wb_stb <= 1'b1; + if (wb_ack == 1'b1) + begin + NextState_EP0St <= `SETUP_GET_DATA_WT_UNGNT; + next_wb_stb <= 1'b0; + next_wLength[15:8] <= wb_data_i; + next_wbBusReq <= 1'b0; + end + end + `SETUP_GET_DATA_DAT7: + begin + next_wb_stb <= 1'b1; + if (wb_ack == 1'b1) + begin + NextState_EP0St <= `SETUP_GET_DATA_DAT8; + next_wb_stb <= 1'b0; + next_wLength[7:0] <= wb_data_i; + end + end + `SETUP_GET_DATA_WT_UNGNT: + begin + if ((wbBusGnt == 1'b0) && (bRequest == `GET_STATUS)) + begin + NextState_EP0St <= `SETUP_GET_STAT; + end + else if ((wbBusGnt == 1'b0) && (bRequest == `GET_DESCRIPTOR)) + begin + NextState_EP0St <= `SETUP_GET_DESC_S1; + end + else if ((wbBusGnt == 1'b0) && (bRequest == `SET_ADDRESS)) + begin + NextState_EP0St <= `SETUP_SET_ADDR; + end + else if (wbBusGnt == 1'b0) + begin + NextState_EP0St <= `DO_TRANS_WT_GNT; + end + end + `SETUP_GET_DESC_S1: + begin + case (wValue[15:8]) + `DEV_DESC: begin + next_txPacketRemSize <= `DEV_DESC_SIZE; + next_txDataIndex <= `DEV_DESC_INDEX; + end + `CFG_DESC: begin + next_txPacketRemSize <= `CFG_DESC_SIZE; + next_txDataIndex <= `CFG_DESC_INDEX; + end + `REP_DESC: begin + next_txPacketRemSize <= `REP_DESC_SIZE; + next_txDataIndex <= `REP_DESC_INDEX; + end + `STRING_DESC: begin + case (wValue[3:0]) + 4'h0: begin + next_txPacketRemSize <= `LANGID_DESC_SIZE; + next_txDataIndex <= `LANGID_DESC_INDEX; + end + 4'h1: begin + next_txPacketRemSize <= `STRING1_DESC_SIZE; + next_txDataIndex <= `STRING1_DESC_INDEX; + end + 4'h2: begin + next_txPacketRemSize <= `STRING2_DESC_SIZE; + next_txDataIndex <= `STRING2_DESC_INDEX; + end + 4'h3: begin + next_txPacketRemSize <= `STRING3_DESC_SIZE; + next_txDataIndex <= `STRING3_DESC_INDEX; + end + endcase + end + endcase + NextState_EP0St <= `SETUP_CHK_MAX_LEN; + end + `IN_CHK_ACK: + begin + if (epStatus[`SC_ACK_RXED_BIT] != 1'b1) + begin + NextState_EP0St <= `DO_TRANS_WT_GNT; + end + else if (updateUSBAddress == 1'b1) + begin + NextState_EP0St <= `IN_WT_GNT; + end + else + begin + NextState_EP0St <= `IN_SET_PTR; + end + end + `IN_SET_PTR: + begin + if (txPacketRemSize > `MAX_RESP_SIZE) begin + next_txDataSize <= `MAX_RESP_SIZE; + next_txPacketRemSize <= txPacketRemSize - `MAX_RESP_SIZE; + end + else begin + next_txDataSize <= txPacketRemSize; + next_txPacketRemSize <= 8'h00; + end + NextState_EP0St <= `DO_TRANS_WT_GNT; + end + `IN_SET_ADDR: + begin + next_wb_addr <= `RA_SC_ADDRESS; + next_wb_data_o <= USBAddress; + next_wb_stb <= 1'b1; + next_wb_we <= 1'b1; + if (wb_ack == 1'b1) + begin + NextState_EP0St <= `IN_WT_UNGNT; + next_wb_stb <= 1'b0; + next_wbBusReq <= 1'b0; + end + end + `IN_WT_GNT: + begin + next_wbBusReq <= 1'b1; + next_updateUSBAddress <= 1'b0; + if (wbBusGnt == 1'b1) + begin + NextState_EP0St <= `IN_SET_ADDR; + end + end + `IN_WT_UNGNT: + begin + if (wbBusGnt == 1'b0) + begin + NextState_EP0St <= `IN_SET_PTR; + end + end + `OUT_CHK_SEQ: + begin + if (epStatus[`SC_DATA_SEQUENCE_BIT] != dataSeq) + begin + NextState_EP0St <= `DO_TRANS_WT_GNT; + end + else + begin + NextState_EP0St <= `DO_TRANS_WT_GNT; + next_dataSeq <= ~dataSeq; + end + end + `INIT_RST: + begin + next_wb_addr <= `RA_HOST_SLAVE_MODE; + next_wb_data_o <= 8'h2; + //reset usbHostSlave + next_wb_stb <= 1'b1; + next_wb_we <= 1'b1; + if (wb_ack == 1'b1) + begin + NextState_EP0St <= `INIT_WT_RST; + next_wb_stb <= 1'b0; + next_cnt <= 8'h00; + end + end + `INIT_WT_GNT: + begin + next_wbBusReq <= 1'b1; + if (wbBusGnt == 1'b1) + begin + NextState_EP0St <= `INIT_RST; + end + end + `INIT_WT_RST: + begin + next_cnt <= cnt + 1'b1; + if (cnt == 8'hff) + begin + NextState_EP0St <= `INIT_WT_VBUS; + end + end + `INIT_WT_VBUS: + begin + next_wb_addr <= `RA_SC_LINE_STATUS_REG; + next_wb_stb <= 1'b1; + next_wb_we <= 1'b0; + if ((wb_ack == 1'b1) && (wb_data_i[`VBUS_PRES_BIT] == 1'b1)) + begin + NextState_EP0St <= `INIT_CONN; + next_wb_stb <= 1'b0; + end + end + `INIT_FIN: + begin + next_wbBusReq <= 1'b0; + next_initComplete <= 1'b1; + if (wbBusGnt == 1'b0) + begin + NextState_EP0St <= `DO_TRANS_WT_GNT; + end + end + `INIT_CONN: + begin + next_wb_addr <= `RA_SC_CONTROL_REG; + next_wb_data_o <= 8'h71; + //connect to host, full speed + next_wb_stb <= 1'b1; + next_wb_we <= 1'b1; + if (wb_ack == 1'b1) + begin + NextState_EP0St <= `INIT_WT_CONN; + next_wb_stb <= 1'b0; + end + end + `INIT_WT_CONN: + begin + next_wb_addr <= `RA_SC_LINE_STATUS_REG; + next_wb_stb <= 1'b1; + next_wb_we <= 1'b0; + if ((wb_ack == 1'b1) && (wb_data_i[1:0] == `FULL_SPEED_CONNECT)) + begin + NextState_EP0St <= `INIT_FIN; + next_wb_stb <= 1'b0; + end + end + endcase +end + +// Current State Logic (sequential) +always @ (posedge clk) +begin + if (rst == 1'b1) + CurrState_EP0St <= `START; + else + CurrState_EP0St <= NextState_EP0St; +end + +// Registered outputs logic +always @ (posedge clk) +begin + if (rst == 1'b1) + begin + wb_addr <= 8'h00; + wb_data_o <= 8'h00; + wb_stb <= 1'b0; + wb_we <= 1'b0; + wbBusReq <= 1'b0; + initComplete <= 1'b0; + memAddr <= 8'h00; + memRdEn <= 1'b0; + cnt <= 8'h00; + txDataSize <= 8'h00; + txDataIndex <= 8'h00; + transDone <= 1'b0; + epStatus <= 8'h00; + rxDataSize <= 16'h0000; + epTransType <= 8'h00; + bm_req_dir <= 1'b0; + bm_req_type <= 2'b00; + bm_req_recp <= 5'b00000; + bRequest <= 8'h00; + wValue <= 16'h0000; + wIndex <= 16'h0000; + wLength <= 16'h0000; + txPacketRemSize <= 8'h00; + USBAddress <= 8'h00; + updateUSBAddress <= 1'b0; + dataSeq <= 1'b0; + end + else + begin + wb_addr <= next_wb_addr; + wb_data_o <= next_wb_data_o; + wb_stb <= next_wb_stb; + wb_we <= next_wb_we; + wbBusReq <= next_wbBusReq; + initComplete <= next_initComplete; + memAddr <= next_memAddr; + memRdEn <= next_memRdEn; + cnt <= next_cnt; + txDataSize <= next_txDataSize; + txDataIndex <= next_txDataIndex; + transDone <= next_transDone; + epStatus <= next_epStatus; + rxDataSize <= next_rxDataSize; + epTransType <= next_epTransType; + bm_req_dir <= next_bm_req_dir; + bm_req_type <= next_bm_req_type; + bm_req_recp <= next_bm_req_recp; + bRequest <= next_bRequest; + wValue <= next_wValue; + wIndex <= next_wIndex; + wLength <= next_wLength; + txPacketRemSize <= next_txPacketRemSize; + USBAddress <= next_USBAddress; + updateUSBAddress <= next_updateUSBAddress; + dataSeq <= next_dataSeq; + end +end + +endmodule \ No newline at end of file Index: Actel/usbDeviceActelTop/hdl/writeUSBWireData.v =================================================================== --- Actel/usbDeviceActelTop/hdl/writeUSBWireData.v (nonexistent) +++ Actel/usbDeviceActelTop/hdl/writeUSBWireData.v (revision 40) @@ -0,0 +1,281 @@ +////////////////////////////////////////////////////////////////////// +//// //// +//// writeUSBWireData.v //// +//// //// +//// This file is part of the usbhostslave opencores effort. +//// //// +//// //// +//// Module Description: //// +//// +//// //// +//// To Do: //// +//// +//// //// +//// Author(s): //// +//// - Steve Fielding, sfielding@base2designs.com //// +//// //// +////////////////////////////////////////////////////////////////////// +//// //// +//// Copyright (C) 2004 Steve Fielding and OPENCORES.ORG //// +//// //// +//// This source file may be used and distributed without //// +//// restriction provided that this copyright statement is not //// +//// removed from the file and that any derivative work contains //// +//// the original copyright notice and the associated disclaimer. //// +//// //// +//// This source file is free software; you can redistribute it //// +//// and/or modify it under the terms of the GNU Lesser General //// +//// Public License as published by the Free Software Foundation; //// +//// either version 2.1 of the License, or (at your option) any //// +//// later version. //// +//// //// +//// This source is distributed in the hope that it will be //// +//// useful, but WITHOUT ANY WARRANTY; without even the implied //// +//// warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR //// +//// PURPOSE. See the GNU Lesser General Public License for more //// +//// details. //// +//// //// +//// You should have received a copy of the GNU Lesser General //// +//// Public License along with this source; if not, download it //// +//// from //// +//// //// +////////////////////////////////////////////////////////////////////// +// +`include "timescale.v" +`include "usbSerialInterfaceEngine_h.v" + +`define BUFFER_FULL 3'b100 + +module writeUSBWireData ( + TxBitsIn, + TxBitsOut, + TxDataOutTick, + TxCtrlIn, + TxCtrlOut, + USBWireRdy, + USBWireWEn, + TxWireActiveDrive, + fullSpeedRate, + clk, + rst + ); + +input [1:0] TxBitsIn; +input TxCtrlIn; +input USBWireWEn; +input clk; +input fullSpeedRate; +input rst; +output [1:0] TxBitsOut; +output TxDataOutTick; +output TxCtrlOut; +output USBWireRdy; +output TxWireActiveDrive; + +wire [1:0] TxBitsIn; +reg [1:0] TxBitsOut; +reg TxDataOutTick; +wire TxCtrlIn; +reg TxCtrlOut; +reg USBWireRdy; +wire USBWireWEn; +wire clk; +wire fullSpeedRate; +wire rst; +reg TxWireActiveDrive; + +// local registers +reg [2:0]buffer0; +reg [2:0]buffer1; +reg [2:0]buffer2; +reg [2:0]buffer3; +reg [2:0]bufferCnt; +reg [1:0]bufferInIndex; +reg [1:0]bufferOutIndex; +reg decBufferCnt; +reg [4:0]i; +reg incBufferCnt; +reg fullSpeedTick; +reg lowSpeedTick; + +// buffer in state machine state codes: +`define WAIT_BUFFER_NOT_FULL 2'b00 +`define WAIT_WRITE_REQ 2'b01 +`define CLR_INC_BUFFER_CNT 2'b10 + +// buffer output state machine state codes: +`define WAIT_BUFFER_FULL 2'b00 +`define WAIT_LINE_WRITE 2'b01 +`define LINE_WRITE 2'b10 + +reg [1:0] bufferInStMachCurrState; +reg [1:0] bufferOutStMachCurrState; + +// buffer control +always @(posedge clk) +begin + if (rst == 1'b1) + begin + bufferCnt <= 3'b000; + end + else + begin + if (incBufferCnt == 1'b1 && decBufferCnt == 1'b0) + bufferCnt <= bufferCnt + 1'b1; + else if (incBufferCnt == 1'b0 && decBufferCnt == 1'b1) + bufferCnt <= bufferCnt - 1'b1; + end +end + + +//buffer input state machine +always @(posedge clk) begin + if (rst == 1'b1) begin + incBufferCnt <= 1'b0; + bufferInIndex <= 2'b00; + buffer0 <= 3'b000; + buffer1 <= 3'b000; + buffer2 <= 3'b000; + buffer3 <= 3'b000; + USBWireRdy <= 1'b0; + bufferInStMachCurrState <= `WAIT_BUFFER_NOT_FULL; + end + else begin + case (bufferInStMachCurrState) + `WAIT_BUFFER_NOT_FULL: + begin + if (bufferCnt != `BUFFER_FULL) + begin + bufferInStMachCurrState <= `WAIT_WRITE_REQ; + USBWireRdy <= 1'b1; + end + end + `WAIT_WRITE_REQ: + begin + if (USBWireWEn == 1'b1) + begin + incBufferCnt <= 1'b1; + USBWireRdy <= 1'b0; + bufferInIndex <= bufferInIndex + 1'b1; + case (bufferInIndex) + 2'b00 : buffer0 <= {TxBitsIn, TxCtrlIn}; + 2'b01 : buffer1 <= {TxBitsIn, TxCtrlIn}; + 2'b10 : buffer2 <= {TxBitsIn, TxCtrlIn}; + 2'b11 : buffer3 <= {TxBitsIn, TxCtrlIn}; + endcase + bufferInStMachCurrState <= `CLR_INC_BUFFER_CNT; + end + end + `CLR_INC_BUFFER_CNT: + begin + incBufferCnt <= 1'b0; + if (bufferCnt != (`BUFFER_FULL - 1'b1) ) + begin + bufferInStMachCurrState <= `WAIT_WRITE_REQ; + USBWireRdy <= 1'b1; + end + else begin + bufferInStMachCurrState <= `WAIT_BUFFER_NOT_FULL; + end + end + endcase + end +end + +//increment counter used to generate USB bit rate +always @(posedge clk) begin + if (rst == 1'b1) + begin + i <= 5'b00000; + fullSpeedTick <= 1'b0; + lowSpeedTick <= 1'b0; + end + else + begin + i <= i + 1'b1; + if (i[1:0] == 2'b00) + fullSpeedTick <= 1'b1; + else + fullSpeedTick <= 1'b0; + if (i == 5'b00000) + lowSpeedTick <= 1'b1; + else + lowSpeedTick <= 1'b0; + end +end + +//buffer output state machine +//buffer is constantly emptied at either +//the full or low speed rate +//if the buffer is empty, then the output is forced to tri-state +always @(posedge clk) begin + if (rst == 1'b1) + begin + bufferOutIndex <= 2'b00; + decBufferCnt <= 1'b0; + TxBitsOut <= 2'b00; + TxCtrlOut <= `TRI_STATE; + TxDataOutTick <= 1'b0; + bufferOutStMachCurrState <= `WAIT_LINE_WRITE; + end + else + begin + case (bufferOutStMachCurrState) + `WAIT_LINE_WRITE: + begin + if ((fullSpeedRate == 1'b1 && fullSpeedTick == 1'b1) || (fullSpeedRate == 1'b0 && lowSpeedTick == 1'b1) ) + begin + TxDataOutTick <= !TxDataOutTick; + if (bufferCnt == 0) begin + TxBitsOut <= 2'b00; + TxCtrlOut <= `TRI_STATE; + end + else begin + bufferOutStMachCurrState <= `LINE_WRITE; + decBufferCnt <= 1'b1; + bufferOutIndex <= bufferOutIndex + 1'b1; + case (bufferOutIndex) + 2'b00 : + begin + TxBitsOut <= buffer0[2:1]; + TxCtrlOut <= buffer0[0]; + end + 2'b01 : + begin + TxBitsOut <= buffer1[2:1]; + TxCtrlOut <= buffer1[0]; + end + 2'b10 : + begin + TxBitsOut <= buffer2[2:1]; + TxCtrlOut <= buffer2[0]; + end + 2'b11 : + begin + TxBitsOut <= buffer3[2:1]; + TxCtrlOut <= buffer3[0]; + end + endcase + end + end + end + `LINE_WRITE: + begin + decBufferCnt <= 1'b0; + bufferOutStMachCurrState <= `WAIT_LINE_WRITE; + end + endcase + end +end + +// control 'TxWireActiveDrive' +always @(TxCtrlOut) +begin + if (TxCtrlOut == `DRIVE) + TxWireActiveDrive <= 1'b1; + else + TxWireActiveDrive <= 1'b0; +end + + +endmodule Index: Actel/usbDeviceActelTop/hdl/usbDeviceAlteraTop.v =================================================================== --- Actel/usbDeviceActelTop/hdl/usbDeviceAlteraTop.v (nonexistent) +++ Actel/usbDeviceActelTop/hdl/usbDeviceAlteraTop.v (revision 40) @@ -0,0 +1,179 @@ +////////////////////////////////////////////////////////////////////// +//// //// +//// usbDeviceAlteraTop.v //// +//// //// +//// This file is part of the spiMaster opencores effort. +//// //// +//// //// +//// Module Description: //// +//// Top level module for Altera FPGA and NXP ISP1105 USB PHY. +//// Specifically it targets the Base2Designs Altera Development board. +//// Instantiates a PLL so that the lock signal can be used +//// to reset the logic, and ties unused control signals +//// to the off or disabled state +//// //// +//// To Do: //// +//// +//// //// +//// Author(s): //// +//// - Steve Fielding, sfielding@base2designs.com //// +//// //// +////////////////////////////////////////////////////////////////////// +//// //// +//// Copyright (C) 2008 Steve Fielding and OPENCORES.ORG //// +//// //// +//// This source file may be used and distributed without //// +//// restriction provided that this copyright statement is not //// +//// removed from the file and that any derivative work contains //// +//// the original copyright notice and the associated disclaimer. //// +//// //// +//// This source file is free software; you can redistribute it //// +//// and/or modify it under the terms of the GNU Lesser General //// +//// Public License as published by the Free Software Foundation; //// +//// either version 2.1 of the License, or (at your option) any //// +//// later version. //// +//// //// +//// This source is distributed in the hope that it will be //// +//// useful, but WITHOUT ANY WARRANTY; without even the implied //// +//// warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR //// +//// PURPOSE. See the GNU Lesser General Public License for more //// +//// details. //// +//// //// +//// You should have received a copy of the GNU Lesser General //// +//// Public License along with this source; if not, download it //// +//// from //// +//// //// +////////////////////////////////////////////////////////////////////// +// + +module usbDeviceAlteraTop ( + + // + // Global signals + // + clk, + + // + // SDRAM + // + mc_addr, + mc_ba, + mc_dqm, + mc_we_, + mc_cas_, + mc_ras_, + mc_cke_, + sdram_cs, + sdram_clk, + + // + // SPI bus + // + spiClk, + spiMasterDataOut, + spiCS_n, + + + // + // USB host + // + usbHostOE_n, + + // + // USB slave + // + usbSlaveVP, + usbSlaveVM, + usbSlaveOE_n, + usbDPlusPullup, + vBusDetect +); + // + // Global signals + // + input clk; + + // + // SDRAM + // + output [11:0] mc_addr; + output [1:0] mc_ba; + output [3:0] mc_dqm; + output mc_we_; + output mc_cas_; + output mc_ras_; + output mc_cke_; + output sdram_cs; + output sdram_clk; + + // + // SPI bus + // + output spiClk; + output spiMasterDataOut; + output spiCS_n; + + // + // USB host + // + output usbHostOE_n; + + // + // USB slave + // + inout usbSlaveVP; + inout usbSlaveVM; + output usbSlaveOE_n; + output usbDPlusPullup; + input vBusDetect; + +//local wires and regs +reg [1:0] rstReg; +wire rst; +wire pll_locked; + +assign mc_addr = {12{1'b0}}; +assign mc_ba = 2'b00; +assign mc_dqm = 4'h0; +assign mc_we_ = 1'b1; +assign mc_cas_ = 1'b1; +assign mc_ras_ = 1'b1; +assign mc_cke_ = 1'b1; +assign sdram_cs = 1'b1; +assign sdram_clk = 1'b1; +assign spiClk = 1'b0; +assign spiMasterDataOut = 1'b0; +assign spiCS_n = 1'b1; +assign usbHostOE_n = 1'b1; + +pll_48MHz pll_48MHz_inst ( + .inclk0 ( clk ), + .locked( pll_locked) + ); + +//generate sync reset from pll lock signal +always @(posedge clk) begin + rstReg[1:0] <= {rstReg[0], ~pll_locked}; +end +assign rst = rstReg[1]; + + +usbDevice u_usbDevice ( + .clk(clk), + .rst(rst), + .usbSlaveVP_in(usbSlaveVP_in), + .usbSlaveVM_in(usbSlaveVM_in), + .usbSlaveVP_out(usbSlaveVP_out), + .usbSlaveVM_out(usbSlaveVM_out), + .usbSlaveOE_n(usbSlaveOE_n), + .usbDPlusPullup(usbDPlusPullup), + .vBusDetect(vBusDetect) +); + + +assign {usbSlaveVP_in, usbSlaveVM_in} = {usbSlaveVP, usbSlaveVM}; +assign {usbSlaveVP, usbSlaveVM} = (usbSlaveOE_n == 1'b0) ? {usbSlaveVP_out, usbSlaveVM_out} : 2'bzz; + +endmodule + + Index: Actel/usbDeviceActelTop/hdl/usbHostSlave_h.v =================================================================== --- Actel/usbDeviceActelTop/hdl/usbHostSlave_h.v (nonexistent) +++ Actel/usbDeviceActelTop/hdl/usbHostSlave_h.v (revision 40) @@ -0,0 +1,80 @@ +////////////////////////////////////////////////////////////////////// +// usbHostSlave_h.v +////////////////////////////////////////////////////////////////////// + +`ifdef usbHostSlave_h_vdefined +`else +`define usbHostSlave_h_vdefined + +// Version 0.6 - Feb 4th 2005. Fixed bit stuffing and de-stuffing. This version succesfully supports +// control reads and writes to USB flash dongle +// Version 0.7 - Feb 24th 2005. Added support for isochronous transfers, fixed resume, connect and disconnect +// time outs, added low speed EOP keep alive. The TX bit rate is now controlled by +// SIETransmitter, and takes account of the requirement that SOF, and PREAMBLE are always full +// speed, and TX resume is always low speed. +// Fixed read clock recovery (readUSBWireData.v) issue which was resulting +// in missing receive packets. +// Fixed broken SOF Sync mode (where transacations are synchronized with the SOF transmission) +// by adding kludged delay to softranmit. This needs to be fixed properly. +// This version has undergone limited testing +// with full speed flash dongle, low speed keyboard, and a PC in full and low speed modes. +// Version 0.8 - June 24th 2005. Added bus access to the host SOFTimer. This version has been tested +// with uClinux, and is known to work with a full speed USB flash stick. +// Moving Opencores project status from Beta to done. +// TODO: Test isochronous mode, and low speed mode using uClinux driver +// Create a seperate clock domain for the bus interface +// Add frame period adjustment capability +// Add compilation flags for slave only and host only versions +// Create data bus width options beyond 8-bit +// Version 1.0 - October 14th 2005. Seperated the bus clock from the usb logic clock +// Removed TX and RX fifo status registers, and removed +// TX fifo data count register. +// Added RESET_CORE bit to HOST_SLAVE_CONTROL_REG. +// Fixed slave mode bug which caused receive fifo to be filled with +// incoming data when the slave was responding with a NAK, and the +// data should have been discarded. +// Version 1.1 - February 23rd 2006. Fixed bug related to 'noActivityTimeOut' +// Previously the 'noActivityTimeOut' flag was repetitively pulsed whenever +// there was no detected activity on the USB data lines. This caused an infrequent +// misreporting of time out errors. 'noActivityTimeOut' is now only enabled when +// the higher level state machines are actively looking for receive packets. +// Modified USB RX data clock recovery, so that data is sampled during the middle +// of a USB bit period. Fixed a bug which could result in double sampling +// of USB RX data if clock phase adjustments were required in the middle of a +// USB packet. +// Version 1.2 - October 1st 2006. Small changes to .asf FSM's required +// during migration to ActiveHDL 7.1. Released SystemC test bench. +// Re-generated .v files using ActiveHDL 7.1 +// Replaced individual timescale directives with `include "timescale.v +// Renamed top level Altera wrapper from 'usbHostSlaveWrap' to +// 'usbHostSlaveAvalonWrap' +// Version 1.3 - March 22nd 2008. Fixed bug in 'readUSBWireData'. Added +// synchronizer to incoming USB wire data to avoid +// metastability, and delay hazards. Not entirely sure, but it appears that +// this bug caused more problems with some of the newer low power FPGAs +// Maybe because they are more prone to problems with metastable +// inputs that feed logic functions causing excessive high speed +// toggle activity, and disrupting nearby cicuits. +// Version 1.4 - June 16th 2008. Added two new top level modules which +// allow the instantiation of only host (usbHost.v), or only device +// features. Added double sync stages between usbClk, and busClk domains +// to fix possible metastability issues. Also modified synchronization to +// allow operation with busClk frequency less than usbClk frequency (down to +// 24MHz). Integrated full support for USB PHY. Prior to this modification +// the user would need to instantiate a GPIO module to control USB speed, +// D+ and D- pull-up control, and VBUS detect. Fixed bug in BI wb_ack. +// Modified cross-clock synchronisation of fifo resets +// Added usbDevice, a standalone usb device implementation of usbhostslave +// no additional hardware or software required + + +// Most significant nibble corresponds to major revision. +// Least significant nibble corresponds to minor revision. +`define USBHOSTSLAVE_VERSION_NUM 8'h14 + +//Host slave common registers +`define HOST_SLAVE_CONTROL_REG 1'b0 +`define HOST_SLAVE_VERSION_REG 1'b1 + +`endif //usbHostSlave_h_vdefined + Index: Actel/usbDeviceActelTop/hdl/wishBoneBI.v =================================================================== --- Actel/usbDeviceActelTop/hdl/wishBoneBI.v (nonexistent) +++ Actel/usbDeviceActelTop/hdl/wishBoneBI.v (revision 40) @@ -0,0 +1,245 @@ +////////////////////////////////////////////////////////////////////// +//// //// +//// wishBoneBI.v //// +//// //// +//// This file is part of the usbhostslave opencores effort. +//// //// +//// //// +//// Module Description: //// +//// +//// //// +//// To Do: //// +//// +//// //// +//// Author(s): //// +//// - Steve Fielding, sfielding@base2designs.com //// +//// //// +////////////////////////////////////////////////////////////////////// +//// //// +//// Copyright (C) 2004 Steve Fielding and OPENCORES.ORG //// +//// //// +//// This source file may be used and distributed without //// +//// restriction provided that this copyright statement is not //// +//// removed from the file and that any derivative work contains //// +//// the original copyright notice and the associated disclaimer. //// +//// //// +//// This source file is free software; you can redistribute it //// +//// and/or modify it under the terms of the GNU Lesser General //// +//// Public License as published by the Free Software Foundation; //// +//// either version 2.1 of the License, or (at your option) any //// +//// later version. //// +//// //// +//// This source is distributed in the hope that it will be //// +//// useful, but WITHOUT ANY WARRANTY; without even the implied //// +//// warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR //// +//// PURPOSE. See the GNU Lesser General Public License for more //// +//// details. //// +//// //// +//// You should have received a copy of the GNU Lesser General //// +//// Public License along with this source; if not, download it //// +//// from //// +//// //// +////////////////////////////////////////////////////////////////////// +// +`include "timescale.v" +`include "wishBoneBus_h.v" + + +module wishBoneBI ( + address, dataIn, dataOut, writeEn, + strobe_i, + ack_o, + clk, rst, + hostControlSel, + hostRxFifoSel, hostTxFifoSel, + slaveControlSel, + slaveEP0RxFifoSel, slaveEP1RxFifoSel, slaveEP2RxFifoSel, slaveEP3RxFifoSel, + slaveEP0TxFifoSel, slaveEP1TxFifoSel, slaveEP2TxFifoSel, slaveEP3TxFifoSel, + hostSlaveMuxSel, + dataFromHostControl, + dataFromHostRxFifo, + dataFromHostTxFifo, + dataFromSlaveControl, + dataFromEP0RxFifo, dataFromEP1RxFifo, dataFromEP2RxFifo, dataFromEP3RxFifo, + dataFromEP0TxFifo, dataFromEP1TxFifo, dataFromEP2TxFifo, dataFromEP3TxFifo, + dataFromHostSlaveMux + ); +input clk; +input rst; +input [7:0] address; +input [7:0] dataIn; +output [7:0] dataOut; +input strobe_i; +output ack_o; +input writeEn; +output hostControlSel; +output hostRxFifoSel; +output hostTxFifoSel; +output slaveControlSel; +output slaveEP0RxFifoSel, slaveEP1RxFifoSel, slaveEP2RxFifoSel, slaveEP3RxFifoSel; +output slaveEP0TxFifoSel, slaveEP1TxFifoSel, slaveEP2TxFifoSel, slaveEP3TxFifoSel; +output hostSlaveMuxSel; +input [7:0] dataFromHostControl; +input [7:0] dataFromHostRxFifo; +input [7:0] dataFromHostTxFifo; +input [7:0] dataFromSlaveControl; +input [7:0] dataFromEP0RxFifo, dataFromEP1RxFifo, dataFromEP2RxFifo, dataFromEP3RxFifo; +input [7:0] dataFromEP0TxFifo, dataFromEP1TxFifo, dataFromEP2TxFifo, dataFromEP3TxFifo; +input [7:0] dataFromHostSlaveMux; + + +wire clk; +wire rst; +wire [7:0] address; +wire [7:0] dataIn; +reg [7:0] dataOut; +wire writeEn; +wire strobe_i; +reg ack_o; +reg hostControlSel; +reg hostRxFifoSel; +reg hostTxFifoSel; +reg slaveControlSel; +reg slaveEP0RxFifoSel, slaveEP1RxFifoSel, slaveEP2RxFifoSel, slaveEP3RxFifoSel; +reg slaveEP0TxFifoSel, slaveEP1TxFifoSel, slaveEP2TxFifoSel, slaveEP3TxFifoSel; +reg hostSlaveMuxSel; +wire [7:0] dataFromHostControl; +wire [7:0] dataFromHostRxFifo; +wire [7:0] dataFromHostTxFifo; +wire [7:0] dataFromSlaveControl; +wire [7:0] dataFromEP0RxFifo, dataFromEP1RxFifo, dataFromEP2RxFifo, dataFromEP3RxFifo; +wire [7:0] dataFromEP0TxFifo, dataFromEP1TxFifo, dataFromEP2TxFifo, dataFromEP3TxFifo; +wire [7:0] dataFromHostSlaveMux; + +//internal wires and regs +reg ack_delayed; +reg ack_immediate; + +//address decode and data mux +always @(address or + dataFromHostControl or + dataFromHostRxFifo or + dataFromHostTxFifo or + dataFromSlaveControl or + dataFromEP0RxFifo or + dataFromEP1RxFifo or + dataFromEP2RxFifo or + dataFromEP3RxFifo or + dataFromHostSlaveMux or + dataFromEP0TxFifo or + dataFromEP1TxFifo or + dataFromEP2TxFifo or + dataFromEP3TxFifo) +begin + hostControlSel <= 1'b0; + hostRxFifoSel <= 1'b0; + hostTxFifoSel <= 1'b0; + slaveControlSel <= 1'b0; + slaveEP0RxFifoSel <= 1'b0; + slaveEP0TxFifoSel <= 1'b0; + slaveEP1RxFifoSel <= 1'b0; + slaveEP1TxFifoSel <= 1'b0; + slaveEP2RxFifoSel <= 1'b0; + slaveEP2TxFifoSel <= 1'b0; + slaveEP3RxFifoSel <= 1'b0; + slaveEP3TxFifoSel <= 1'b0; + hostSlaveMuxSel <= 1'b0; + case (address & `ADDRESS_DECODE_MASK) + `HCREG_BASE : begin + hostControlSel <= 1'b1; + dataOut <= dataFromHostControl; + end + `HCREG_BASE_PLUS_0X10 : begin + hostControlSel <= 1'b1; + dataOut <= dataFromHostControl; + end + `HOST_RX_FIFO_BASE : begin + hostRxFifoSel <= 1'b1; + dataOut <= dataFromHostRxFifo; + end + `HOST_TX_FIFO_BASE : begin + hostTxFifoSel <= 1'b1; + dataOut <= dataFromHostTxFifo; + end + `SCREG_BASE : begin + slaveControlSel <= 1'b1; + dataOut <= dataFromSlaveControl; + end + `SCREG_BASE_PLUS_0X10 : begin + slaveControlSel <= 1'b1; + dataOut <= dataFromSlaveControl; + end + `EP0_RX_FIFO_BASE : begin + slaveEP0RxFifoSel <= 1'b1; + dataOut <= dataFromEP0RxFifo; + end + `EP0_TX_FIFO_BASE : begin + slaveEP0TxFifoSel <= 1'b1; + dataOut <= dataFromEP0TxFifo; + end + `EP1_RX_FIFO_BASE : begin + slaveEP1RxFifoSel <= 1'b1; + dataOut <= dataFromEP1RxFifo; + end + `EP1_TX_FIFO_BASE : begin + slaveEP1TxFifoSel <= 1'b1; + dataOut <= dataFromEP1TxFifo; + end + `EP2_RX_FIFO_BASE : begin + slaveEP2RxFifoSel <= 1'b1; + dataOut <= dataFromEP2RxFifo; + end + `EP2_TX_FIFO_BASE : begin + slaveEP2TxFifoSel <= 1'b1; + dataOut <= dataFromEP2TxFifo; + end + `EP3_RX_FIFO_BASE : begin + slaveEP3RxFifoSel <= 1'b1; + dataOut <= dataFromEP3RxFifo; + end + `EP3_TX_FIFO_BASE : begin + slaveEP3TxFifoSel <= 1'b1; + dataOut <= dataFromEP3TxFifo; + end + `HOST_SLAVE_CONTROL_BASE : begin + hostSlaveMuxSel <= 1'b1; + dataOut <= dataFromHostSlaveMux; + end + default: + dataOut <= 8'h00; + endcase +end + +//delayed ack +always @(posedge clk) begin + ack_delayed <= strobe_i; +end + +//immediate ack +always @(strobe_i) begin + ack_immediate <= strobe_i; +end + +//select between immediate and delayed ack +always @(writeEn or address or ack_delayed or ack_immediate) begin + if (writeEn == 1'b0 && + (address == `HOST_RX_FIFO_BASE + `FIFO_DATA_REG || + address == `HOST_TX_FIFO_BASE + `FIFO_DATA_REG || + address == `EP0_RX_FIFO_BASE + `FIFO_DATA_REG || + address == `EP0_TX_FIFO_BASE + `FIFO_DATA_REG || + address == `EP1_RX_FIFO_BASE + `FIFO_DATA_REG || + address == `EP1_TX_FIFO_BASE + `FIFO_DATA_REG || + address == `EP2_RX_FIFO_BASE + `FIFO_DATA_REG || + address == `EP2_TX_FIFO_BASE + `FIFO_DATA_REG || + address == `EP3_RX_FIFO_BASE + `FIFO_DATA_REG || + address == `EP3_TX_FIFO_BASE + `FIFO_DATA_REG) ) + begin + ack_o <= ack_delayed & ack_immediate; + end + else + begin + ack_o <= ack_immediate; + end +end + +endmodule Index: Actel/usbDeviceActelTop/hdl/lineControlUpdate.v =================================================================== --- Actel/usbDeviceActelTop/hdl/lineControlUpdate.v (nonexistent) +++ Actel/usbDeviceActelTop/hdl/lineControlUpdate.v (revision 40) @@ -0,0 +1,75 @@ +////////////////////////////////////////////////////////////////////// +//// //// +//// lineControlUpdate.v //// +//// //// +//// This file is part of the usbhostslave opencores effort. +//// //// +//// //// +//// Module Description: //// +//// +//// //// +//// To Do: //// +//// +//// //// +//// Author(s): //// +//// - Steve Fielding, sfielding@base2designs.com //// +//// //// +////////////////////////////////////////////////////////////////////// +//// //// +//// Copyright (C) 2004 Steve Fielding and OPENCORES.ORG //// +//// //// +//// This source file may be used and distributed without //// +//// restriction provided that this copyright statement is not //// +//// removed from the file and that any derivative work contains //// +//// the original copyright notice and the associated disclaimer. //// +//// //// +//// This source file is free software; you can redistribute it //// +//// and/or modify it under the terms of the GNU Lesser General //// +//// Public License as published by the Free Software Foundation; //// +//// either version 2.1 of the License, or (at your option) any //// +//// later version. //// +//// //// +//// This source is distributed in the hope that it will be //// +//// useful, but WITHOUT ANY WARRANTY; without even the implied //// +//// warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR //// +//// PURPOSE. See the GNU Lesser General Public License for more //// +//// details. //// +//// //// +//// You should have received a copy of the GNU Lesser General //// +//// Public License along with this source; if not, download it //// +//// from //// +//// //// +////////////////////////////////////////////////////////////////////// +// +`include "timescale.v" +`include "usbSerialInterfaceEngine_h.v" + +module lineControlUpdate(fullSpeedPolarity, fullSpeedBitRate, JBit, KBit); +input fullSpeedPolarity; +input fullSpeedBitRate; +output [1:0] JBit; +output [1:0] KBit; + +wire fullSpeedPolarity; +wire fullSpeedBitRate; +reg [1:0] JBit; +reg [1:0] KBit; + + + +always @(fullSpeedPolarity) +begin + if (fullSpeedPolarity == 1'b1) + begin + JBit = `ONE_ZERO; + KBit = `ZERO_ONE; + end + else + begin + JBit = `ZERO_ONE; + KBit = `ONE_ZERO; + end +end + + +endmodule Index: Actel/usbDeviceActelTop/hdl/usbSlaveControl_h.v =================================================================== --- Actel/usbDeviceActelTop/hdl/usbSlaveControl_h.v (nonexistent) +++ Actel/usbDeviceActelTop/hdl/usbSlaveControl_h.v (revision 40) @@ -0,0 +1,86 @@ +////////////////////////////////////////////////////////////////////// +// usbSlaveControl.v +////////////////////////////////////////////////////////////////////// + +`ifdef usbSlaveControl_h_vdefined +`else +`define usbSlaveControl_h_vdefined + +//endPointConstants +`define NUM_OF_ENDPOINTS 4 +`define NUM_OF_REGISTERS_PER_ENDPOINT 4 +`define BASE_INDEX_FOR_ENDPOINT_REGS 0 +`define ENDPOINT_CONTROL_REG 0 +`define ENDPOINT_STATUS_REG 1 +`define ENDPOINT_TRANSTYPE_STATUS_REG 2 +`define NAK_TRANSTYPE_STATUS_REG 3 +`define EP0_CTRL_REG 5'h0 +`define EP0_STS_REG 5'h1 +`define EP0_TRAN_TYPE_STS_REG 5'h2 +`define EP0_NAK_TRAN_TYPE_STS_REG 5'h3 +`define EP1_CTRL_REG 5'h4 +`define EP1_STS_REG 5'h5 +`define EP1_TRAN_TYPE_STS_REG 5'h6 +`define EP1_NAK_TRAN_TYPE_STS_REG 5'h7 +`define EP2_CTRL_REG 5'h8 +`define EP2_STS_REG 5'h9 +`define EP2_TRAN_TYPE_STS_REG 5'ha +`define EP2_NAK_TRAN_TYPE_STS_REG 5'hb +`define EP3_CTRL_REG 5'hc +`define EP3_STS_REG 5'hd +`define EP3_TRAN_TYPE_STS_REG 5'he +`define EP3_NAK_TRAN_TYPE_STS_REG 5'hf + + +//SCRegIndices +`define LAST_ENDP_REG = `BASE_INDEX_FOR_ENDPOINT_REGS + (`NUM_OF_REGISTERS_PER_ENDPOINT * `NUM_OF_ENDPOINTS) - 1 +`define SC_CONTROL_REG 5'h10 +`define SC_LINE_STATUS_REG 5'h11 +`define SC_INTERRUPT_STATUS_REG 5'h12 +`define SC_INTERRUPT_MASK_REG 5'h13 +`define SC_ADDRESS 5'h14 +`define SC_FRAME_NUM_MSP 5'h15 +`define SC_FRAME_NUM_LSP 5'h16 +`define SCREG_BUFFER_LEN 5'h17 +//SCRXStatusRegIndices +`define NAK_SET_MASK 8'h10 +`define SC_CRC_ERROR_BIT 0 +`define SC_BIT_STUFF_ERROR_BIT 1 +`define SC_RX_OVERFLOW_BIT 2 +`define SC_RX_TIME_OUT_BIT 3 +`define SC_NAK_SENT_BIT 4 +`define SC_STALL_SENT_BIT 5 +`define SC_ACK_RXED_BIT 6 +`define SC_DATA_SEQUENCE_BIT 7 +//SCEndPointControlRegIndices +`define ENDPOINT_ENABLE_BIT 0 +`define ENDPOINT_READY_BIT 1 +`define ENDPOINT_OUTDATA_SEQUENCE_BIT 2 +`define ENDPOINT_SEND_STALL_BIT 3 +`define ENDPOINT_ISO_ENABLE_BIT 4 +//SCMasterControlegIndices +`define SC_GLOBAL_ENABLE_BIT 0 +`define SC_TX_LINE_STATE_LSBIT 1 +`define SC_TX_LINE_STATE_MSBIT 2 +`define SC_DIRECT_CONTROL_BIT 3 +`define SC_FULL_SPEED_LINE_POLARITY_BIT 4 +`define SC_FULL_SPEED_LINE_RATE_BIT 5 +`define SC_CONNECT_TO_HOST_BIT 6 +//SCinterruptRegIndices +`define TRANS_DONE_BIT 0 +`define RESUME_INT_BIT 1 +`define RESET_EVENT_BIT 2 //Line has entered reset state or left reset state +`define SOF_RECEIVED_BIT 3 +`define NAK_SENT_INT_BIT 4 +`define VBUS_DET_INT_BIT 5 +//TXTransactionTypes +`define SC_SETUP_TRANS 0 +`define SC_IN_TRANS 1 +`define SC_OUTDATA_TRANS 2 +//timeOuts +`define SC_RX_PACKET_TOUT 18 + +//line status reg +`define VBUS_PRES_BIT 2 + +`endif //usbSlaveControl_h_vdefined Index: Actel/usbDeviceActelTop/hdl/RxFifo.v =================================================================== --- Actel/usbDeviceActelTop/hdl/RxFifo.v (nonexistent) +++ Actel/usbDeviceActelTop/hdl/RxFifo.v (revision 40) @@ -0,0 +1,134 @@ +////////////////////////////////////////////////////////////////////// +//// //// +//// RxFifo.v //// +//// //// +//// This file is part of the usbhostslave opencores effort. +//// //// +//// //// +//// Module Description: //// +//// parameterized RxFifo wrapper. Min depth = 2, Max depth = 65536 +//// fifo read access via bus interface, fifo write access is direct +//// +//// //// +//// To Do: //// +//// +//// //// +//// Author(s): //// +//// - Steve Fielding, sfielding@base2designs.com //// +//// //// +////////////////////////////////////////////////////////////////////// +//// //// +//// Copyright (C) 2004 Steve Fielding and OPENCORES.ORG //// +//// //// +//// This source file may be used and distributed without //// +//// restriction provided that this copyright statement is not //// +//// removed from the file and that any derivative work contains //// +//// the original copyright notice and the associated disclaimer. //// +//// //// +//// This source file is free software; you can redistribute it //// +//// and/or modify it under the terms of the GNU Lesser General //// +//// Public License as published by the Free Software Foundation; //// +//// either version 2.1 of the License, or (at your option) any //// +//// later version. //// +//// //// +//// This source is distributed in the hope that it will be //// +//// useful, but WITHOUT ANY WARRANTY; without even the implied //// +//// warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR //// +//// PURPOSE. See the GNU Lesser General Public License for more //// +//// details. //// +//// //// +//// You should have received a copy of the GNU Lesser General //// +//// Public License along with this source; if not, download it //// +//// from //// +//// //// +////////////////////////////////////////////////////////////////////// +// +`include "timescale.v" + +module RxFifo( + busClk, + usbClk, + rstSyncToBusClk, + rstSyncToUsbClk, + fifoWEn, + fifoFull, + busAddress, + busWriteEn, + busStrobe_i, + busFifoSelect, + busDataIn, + busDataOut, + fifoDataIn ); + //FIFO_DEPTH = ADDR_WIDTH^2 + parameter FIFO_DEPTH = 64; + parameter ADDR_WIDTH = 6; + +input busClk; +input usbClk; +input rstSyncToBusClk; +input rstSyncToUsbClk; +input fifoWEn; +output fifoFull; +input [2:0] busAddress; +input busWriteEn; +input busStrobe_i; +input busFifoSelect; +input [7:0] busDataIn; +output [7:0] busDataOut; +input [7:0] fifoDataIn; + +wire busClk; +wire usbClk; +wire rstSyncToBusClk; +wire rstSyncToUsbClk; +wire fifoWEn; +wire fifoFull; +wire [2:0] busAddress; +wire busWriteEn; +wire busStrobe_i; +wire busFifoSelect; +wire [7:0] busDataIn; +wire [7:0] busDataOut; +wire [7:0] fifoDataIn; + +//internal wires and regs +wire [7:0] dataFromFifoToBus; +wire fifoREn; +wire forceEmptySyncToBusClk; +wire forceEmptySyncToUsbClk; +wire [15:0] numElementsInFifo; +wire fifoEmpty; //not used + +fifoRTL #(8, FIFO_DEPTH, ADDR_WIDTH) u_fifo( + .wrClk(usbClk), + .rdClk(busClk), + .rstSyncToWrClk(rstSyncToUsbClk), + .rstSyncToRdClk(rstSyncToBusClk), + .dataIn(fifoDataIn), + .dataOut(dataFromFifoToBus), + .fifoWEn(fifoWEn), + .fifoREn(fifoREn), + .fifoFull(fifoFull), + .fifoEmpty(fifoEmpty), + .forceEmptySyncToWrClk(forceEmptySyncToUsbClk), + .forceEmptySyncToRdClk(forceEmptySyncToBusClk), + .numElementsInFifo(numElementsInFifo) ); + +RxfifoBI u_RxfifoBI( + .address(busAddress), + .writeEn(busWriteEn), + .strobe_i(busStrobe_i), + .busClk(busClk), + .usbClk(usbClk), + .rstSyncToBusClk(rstSyncToBusClk), + .fifoSelect(busFifoSelect), + .fifoDataIn(dataFromFifoToBus), + .busDataIn(busDataIn), + .busDataOut(busDataOut), + .fifoREn(fifoREn), + .forceEmptySyncToBusClk(forceEmptySyncToBusClk), + .forceEmptySyncToUsbClk(forceEmptySyncToUsbClk), + .numElementsInFifo(numElementsInFifo) + ); + +endmodule Index: Actel/usbDeviceActelTop/hdl/usbROM_logitech_mouse.v =================================================================== --- Actel/usbDeviceActelTop/hdl/usbROM_logitech_mouse.v (nonexistent) +++ Actel/usbDeviceActelTop/hdl/usbROM_logitech_mouse.v (revision 40) @@ -0,0 +1,213 @@ +// ----------------------------- usbROM --------------------------- +// if you modify this file, be sure to modify usbDevice_define.v +// Using RAM rather than logic resources might be a more efficient implememtation +// but this has the advantage of working with FPGAs that do not provide a +// mechanism for initialising RAM, eg Actel IGLOO +// Quartus 7.2 will infer this code as BLOCK RAM, and provide initialisation - nice +`include "usbDevice_define.v" + + +module usbROM ( + clk, + addr, + data +); +input clk; +input [7:0] addr; +output [7:0] data; +reg [7:0] data; + +always @(posedge clk) begin + case (addr) +// ==================================== +// ===== DEVICE Descriptor ===== +// ==================================== + + 8'h00: data <= 8'h12; //BYTE bLength + 8'h01: data <= 8'h01; //BYTE bDescriptorType + 8'h02: data <= 8'h10; //WORD (Lo) bcdUSB version supported + 8'h03: data <= 8'h01; //WORD (Hi) bcdUSB version supported + 8'h04: data <= 8'h00; //BYTE bDeviceClass + 8'h05: data <= 8'h00; //BYTE bDeviceSubClass + 8'h06: data <= 8'h00; //BYTE bDeviceProtocol + 8'h07: data <= `MAX_RESP_SIZE; //BYTE bMaxPacketSize + 8'h08: data <= 8'h6d; //WORD (Lo) idVendor + 8'h09: data <= 8'h04; //WORD (Hi) idVendor + 8'h0a: data <= 8'h3d; //WORD (Lo) idProduct; For Logitech mouse + 8'h0b: data <= 8'hc0; //WORD (Hi) idProduct; For Logitech Hub mouse + 8'h0c: data <= 8'h00; //WORD (Lo) bcdDevice + 8'h0d: data <= 8'h20; //WORD (Hi) bcdDevice + 8'h0e: data <= 8'h01; //BYTE iManufacturer + 8'h0f: data <= 8'h02; //BYTE iProduct + 8'h10: data <= 8'h00; //BYTE iSerialNumber + 8'h11: data <= 8'h01; //BYTE bNumConfigurations + + +// ==================================== +// ===== Configuration Descriptor ===== +// ==================================== + 8'h12: data <= 8'h09; //BYTE bLength (Configuration descriptor) + 8'h13: data <= 8'h02; //BYTE bDescriptorType //Assigned by USB + 8'h14: data <= 8'h22; //WORD (Lo) wTotalLength + 8'h15: data <= 8'h00; //WORD (Hi) wTotalLength + 8'h16: data <= 8'h01; //BYTE bNumInterfaces + 8'h17: data <= 8'h01; //BYTE bConfigurationValue + 8'h18: data <= 8'h00; //BYTE iConfiguration + 8'h19: data <= 8'ha0; //BYTE bmAttributes, Bus powered and remote wakeup + 8'h1a: data <= 8'h31; //BYTE MaxPower, 98mA + +// ==================================== +// ===== Interface Descriptor ===== +// ==================================== + 8'h1b: data <= 8'h09; //BYTE bLength (Interface descriptor) + 8'h1c: data <= 8'h04; //BYTE bDescriptionType; assigned by USB + 8'h1d: data <= 8'h00; //BYTE bInterfaceNumber + 8'h1e: data <= 8'h00; //BYTE bAlternateSetting + 8'h1f: data <= 8'h01; //BYTE bNumEndpoints; uses 1 endpoints + 8'h20: data <= 8'h03; //BYTE bInterfaceClass; HID Class - 0x03 + 8'h21: data <= 8'h01; //BYTE bInterfaceSubClass + 8'h22: data <= 8'h02; //BYTE bInterfaceProtocol + 8'h23: data <= 8'h00; //BYTE iInterface + +// ==================================== +// ===== HID Descriptor ===== +// ==================================== + 8'h24: data <= 8'h09; //BYTE bLength (HID Descriptor) + 8'h25: data <= 8'h21; //BYTE bDescriptorType + 8'h26: data <= 8'h10; //WORD (Lo) bcdHID + 8'h27: data <= 8'h01; //WORD (Hi) bcdHID + 8'h28: data <= 8'h00; //BYTE bCountryCode + 8'h29: data <= 8'h01; //BYTE bNumDescriptors + 8'h2a: data <= 8'h22; //BYTE bReportDescriptorType + 8'h2b: data <= 8'h32; //WORD (Lo) wItemLength + 8'h2c: data <= 8'h00; //WORD (Hi) wItemLength + +// ==================================== +// ===== Endpoint 1 Descriptor ===== +// ==================================== + 8'h2d: data <= 8'h07; //BYTE bLength (Endpoint Descriptor) + 8'h2e: data <= 8'h05; //BYTE bDescriptorType; assigned by USB + 8'h2f: data <= 8'h81; //BYTE bEndpointAddress; IN endpoint; endpoint 1 + 8'h30: data <= 8'h03; //BYTE bmAttributes; Interrupt endpoint + 8'h31: data <= 8'h04; //WORD (Lo) wMaxPacketSize + 8'h32: data <= 8'h00; //WORD (Hi) wMaxPacketSize + 8'h33: data <= 8'h0a; //BYTE bInterval + + +// ==================================== +// ===== Report Descriptor ===== +// ==================================== + + 8'h3a: data <= 8'h05; 8'h3b: data <= 8'h01; // USAGE_PAGE (Generic Desktop) + 8'h3c: data <= 8'h09; 8'h3d: data <= 8'h02; // USAGE (Mouse) + 8'h3e: data <= 8'ha1; 8'h3f: data <= 8'h01; // COLLECTION (Application) + 8'h40: data <= 8'h09; 8'h41: data <= 8'h01; // USAGE (Pointer) + 8'h42: data <= 8'ha1; 8'h43: data <= 8'h00; // COLLECTION (Physical) + 8'h44: data <= 8'h05; 8'h45: data <= 8'h09; // USAGE_PAGE (Button) + 8'h46: data <= 8'h19; 8'h47: data <= 8'h01; // USAGE_MINIMUM (Button 1) + 8'h48: data <= 8'h29; 8'h49: data <= 8'h03; // USAGE_MAXIMUM (Button 3) + 8'h4a: data <= 8'h15; 8'h4b: data <= 8'h00; // LOGICAL_MINIMUM (0) + 8'h4c: data <= 8'h25; 8'h4d: data <= 8'h01; // LOGICAL_MAXIMUM (1) + 8'h4e: data <= 8'h95; 8'h4f: data <= 8'h03; // REPORT_COUNT (3) + 8'h50: data <= 8'h75; 8'h51: data <= 8'h01; // REPORT_SIZE (1) + 8'h52: data <= 8'h81; 8'h53: data <= 8'h02; // INPUT (Data,Var,Abs) + 8'h54: data <= 8'h95; 8'h55: data <= 8'h05; // REPORT_COUNT (5) + 8'h56: data <= 8'h81; 8'h57: data <= 8'h03; // INPUT (Cnst,Var,Rel) + 8'h58: data <= 8'h05; 8'h59: data <= 8'h01; // USAGE_PAGE (Generic Desktop) + 8'h5a: data <= 8'h09; 8'h5b: data <= 8'h30; // USAGE (X) + 8'h5c: data <= 8'h09; 8'h5d: data <= 8'h31; // USAGE (Y) + 8'h5e: data <= 8'h09; 8'h5f: data <= 8'h38; // USAGE ? + 8'h60: data <= 8'h15; 8'h61: data <= 8'h81; // LOGICAL_MINIMUM (-127) + 8'h62: data <= 8'h25; 8'h63: data <= 8'h7f; // LOGICAL_MAXIMUM (127) + 8'h64: data <= 8'h75; 8'h65: data <= 8'h08; // REPORT_SIZE (8) + 8'h66: data <= 8'h95; 8'h67: data <= 8'h03; // REPORT_COUNT (3) + 8'h68: data <= 8'h81; 8'h69: data <= 8'h06; // INPUT (Data,Var,Rel) + 8'h6a: data <= 8'hc0; //END_COLLECTION + 8'h6b: data <= 8'hc0; // END_COLLECTION + +// ZERO_ZERO + 8'h6c: data <= 8'h00; + 8'h6d: data <= 8'h00; +// ONE_ZERO + 8'h6e: data <= 8'h01; + 8'h6f: data <= 8'h00; +// Vendor data + 8'h70: data <= 8'h00; + 8'h71: data <= 8'h00; + +// ============================================= +// ===== Language ID Descriptor(String0) ===== +// ============================================= + 8'h80: data <= 8'h04; // bLength + 8'h81: data <= 8'h03; // bDescriptorType = String Desc + 8'h82: data <= 8'h09; // wLangID (Lo) (Lang ID for English = 0x0409) + 8'h83: data <= 8'h04; // wLangID (Hi) (Lang ID for English = 0x0409) + +// ==================================== +// ===== string 1 Descriptor ===== +// ==================================== + 8'h90: data <= 8'd26; // bLength + 8'h91: data <= 8'h03; // bDescriptorType = String Desc + // Noting that text is always unicode, hence the 'padding' + 8'h92: data <= "B"; 8'h93: data <= 8'h00; + 8'h94: data <= "a"; 8'h95: data <= 8'h00; + 8'h96: data <= "s"; 8'h97: data <= 8'h00; + 8'h98: data <= "e"; 8'h99: data <= 8'h00; + 8'h9a: data <= "2"; 8'h9b: data <= 8'h00; + 8'h9c: data <= "D"; 8'h9d: data <= 8'h00; + 8'h9e: data <= "e"; 8'h9f: data <= 8'h00; + 8'ha0: data <= "s"; 8'ha1: data <= 8'h00; + 8'ha2: data <= "i"; 8'ha3: data <= 8'h00; + 8'ha4: data <= "g"; 8'ha5: data <= 8'h00; + 8'ha6: data <= "n"; 8'ha7: data <= 8'h00; + 8'ha8: data <= "s"; 8'ha9: data <= 8'h00; + + + +// ==================================== +// ===== string 2 Descriptor ===== +// ==================================== + 8'hb0: data <= 8'd20; // bLength + 8'hb1: data <= 8'h03; // bDescriptorType = String Desc + // Noting that text is always unicode, hence the 'padding' + 8'hb2: data <= "B"; 8'hb3: data <= 8'h00; + 8'hb4: data <= "2"; 8'hb5: data <= 8'h00; + 8'hb6: data <= "D"; 8'hb7: data <= 8'h00; + 8'hb8: data <= " "; 8'hb9: data <= 8'h00; + 8'hba: data <= "M"; 8'hbb: data <= 8'h00; + 8'hbc: data <= "o"; 8'hbd: data <= 8'h00; + 8'hbe: data <= "u"; 8'hbf: data <= 8'h00; + 8'hc0: data <= "s"; 8'hc1: data <= 8'h00; + 8'hc2: data <= "e"; 8'hc3: data <= 8'h00; + +// ==================================== +// ===== string 3 Descriptor ===== +// ==================================== + 8'hd0: data <= 8'd30; // bLength + 8'hd1: data <= 8'h03; // bDescriptorType = String Desc + // Noting that text is always unicode, hence the 'padding' + 8'hd2: data <= "L"; 8'hd3: data <= 8'h00; + 8'hd4: data <= "i"; 8'hd5: data <= 8'h00; + 8'hd6: data <= "m"; 8'hd7: data <= 8'h00; + 8'hd8: data <= "i"; 8'hd9: data <= 8'h00; + 8'hda: data <= "t"; 8'hdb: data <= 8'h00; + 8'hdc: data <= "e"; 8'hdd: data <= 8'h00; + 8'hde: data <= "d"; 8'hdf: data <= 8'h00; + 8'he0: data <= "E"; 8'he1: data <= 8'h00; + 8'he2: data <= "d"; 8'he3: data <= 8'h00; + 8'he4: data <= "i"; 8'he5: data <= 8'h00; + 8'he6: data <= "t"; 8'he7: data <= 8'h00; + 8'he8: data <= "i"; 8'he9: data <= 8'h00; + 8'hea: data <= "o"; 8'heb: data <= 8'h00; + 8'hec: data <= "n"; 8'hed: data <= 8'h00; + + + + default: data <= 8'h00; + endcase +end + +endmodule + + + Index: Actel/usbDeviceActelTop/hdl/EP1Mouse.v =================================================================== --- Actel/usbDeviceActelTop/hdl/EP1Mouse.v (nonexistent) +++ Actel/usbDeviceActelTop/hdl/EP1Mouse.v (revision 40) @@ -0,0 +1,295 @@ + +////////////////////////////////////////////////////////////////////// +//// //// +//// EP1Mouse.v //// +//// //// +//// This file is part of the usbHostSlave opencores effort. +//// //// +//// //// +//// Module Description: //// +//// Implements EP1 as a IN endpoint +//// simulating a mouse (a broken one) by +//// responding to IN requests with a constant (x,y) <= (1,1) +//// which causes the mouse pointer to move from +//// top left to bottom right of the screen +//// //// +//// To Do: //// +//// +//// //// +//// Author(s): //// +//// - Steve Fielding, sfielding@base2designs.com //// +//// //// +////////////////////////////////////////////////////////////////////// +//// //// +//// Copyright (C) 2008 Steve Fielding and OPENCORES.ORG //// +//// //// +//// This source file may be used and distributed without //// +//// restriction provided that this copyright statement is not //// +//// removed from the file and that any derivative work contains //// +//// the original copyright notice and the associated disclaimer. //// +//// //// +//// This source file is free software; you can redistribute it //// +//// and/or modify it under the terms of the GNU Lesser General //// +//// Public License as published by the Free Software Foundation; //// +//// either version 2.1 of the License, or (at your option) any //// +//// later version. //// +//// //// +//// This source is distributed in the hope that it will be //// +//// useful, but WITHOUT ANY WARRANTY; without even the implied //// +//// warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR //// +//// PURPOSE. See the GNU Lesser General Public License for more //// +//// details. //// +//// //// +//// You should have received a copy of the GNU Lesser General //// +//// Public License along with this source; if not, download it //// +//// from //// +//// //// +////////////////////////////////////////////////////////////////////// +// +`include "timescale.v" +`include "usbHostSlaveReg_define.v" + +module EP1Mouse (clk, initComplete, rst, wb_ack, wb_addr, wb_data_i, wb_data_o, wb_stb, wb_we, wbBusGnt, wbBusReq); +input clk; +input initComplete; +input rst; +input wb_ack; +input [7:0]wb_data_i; +input wbBusGnt; +output [7:0]wb_addr; +output [7:0]wb_data_o; +output wb_stb; +output wb_we; +output wbBusReq; + +wire clk; +wire initComplete; +wire rst; +wire wb_ack; +reg [7:0]wb_addr, next_wb_addr; +wire [7:0]wb_data_i; +reg [7:0]wb_data_o, next_wb_data_o; +reg wb_stb, next_wb_stb; +reg wb_we, next_wb_we; +wire wbBusGnt; +reg wbBusReq, next_wbBusReq; + +// diagram signals declarations +reg [7:0]cnt, next_cnt; +reg dataSeq, next_dataSeq; +reg localRst, next_localRst; +reg transDone, next_transDone; + +// BINARY ENCODED state machine: EP1St +// State codes definitions: +`define DO_TRANS_WT_GNT 4'b0000 +`define DO_TRANS_TX_EMPTY 4'b0001 +`define DO_TRANS_WR_TX_FIFO1 4'b0010 +`define DO_TRANS_TRANS_GO 4'b0011 +`define DO_TRANS_WT_TRANS_DONE_WT_GNT 4'b0100 +`define DO_TRANS_WT_TRANS_DONE_GET_RDY_STS 4'b0101 +`define DO_TRANS_WT_TRANS_DONE_WT_UNGNT 4'b0110 +`define DO_TRANS_WT_TRANS_DONE_CHK_DONE 4'b0111 +`define START 4'b1000 +`define DO_TRANS_WR_TX_FIFO2 4'b1001 +`define DO_TRANS_WR_TX_FIFO3 4'b1010 +`define DO_TRANS_WT_TRANS_DONE_DEL 4'b1011 + +reg [3:0]CurrState_EP1St, NextState_EP1St; + +// Diagram actions (continuous assignments allowed only: assign ...) +// diagram ACTION + + +// Machine: EP1St + +// NextState logic (combinatorial) +always @ (wbBusGnt or wb_ack or wb_data_i or transDone or initComplete or cnt or wbBusReq or wb_addr or wb_data_o or wb_stb or wb_we or dataSeq or CurrState_EP1St) +begin + NextState_EP1St <= CurrState_EP1St; + // Set default values for outputs and signals + next_wbBusReq <= wbBusReq; + next_wb_addr <= wb_addr; + next_wb_data_o <= wb_data_o; + next_wb_stb <= wb_stb; + next_wb_we <= wb_we; + next_dataSeq <= dataSeq; + next_transDone <= transDone; + next_cnt <= cnt; + case (CurrState_EP1St) // synopsys parallel_case full_case + `START: + begin + next_wbBusReq <= 1'b0; + next_wb_addr <= 8'h00; + next_wb_data_o <= 8'h00; + next_wb_stb <= 1'b0; + next_wb_we <= 1'b0; + next_cnt <= 8'h00; + next_dataSeq <= 1'b0; + next_transDone <= 1'b0; + if (initComplete == 1'b1) + begin + NextState_EP1St <= `DO_TRANS_WT_GNT; + end + end + `DO_TRANS_WT_GNT: + begin + next_wbBusReq <= 1'b1; + if (wbBusGnt == 1'b1) + begin + NextState_EP1St <= `DO_TRANS_TX_EMPTY; + end + end + `DO_TRANS_TX_EMPTY: + begin + next_wb_addr <= `RA_EP1_TX_FIFO_CONTROL_REG; + next_wb_data_o <= 8'h01; + //force tx fifo empty + next_wb_stb <= 1'b1; + next_wb_we <= 1'b1; + if (wb_ack == 1'b1) + begin + NextState_EP1St <= `DO_TRANS_WR_TX_FIFO1; + next_wb_stb <= 1'b0; + next_wb_addr <= `RA_EP1_TX_FIFO_DATA_REG; + next_wb_we <= 1'b1; + end + end + `DO_TRANS_WR_TX_FIFO1: + begin + next_wb_data_o <= 8'h00; + next_wb_stb <= 1'b1; + if (wb_ack == 1'b1) + begin + NextState_EP1St <= `DO_TRANS_WR_TX_FIFO2; + next_wb_stb <= 1'b0; + end + end + `DO_TRANS_TRANS_GO: + begin + next_wb_addr <= `RA_EP1_CONTROL_REG; + if (dataSeq == 1'b1) + next_wb_data_o <= 8'h07; + else + next_wb_data_o <= 8'h03; + next_wb_stb <= 1'b1; + next_wb_we <= 1'b1; + if (wb_ack == 1'b1) + begin + NextState_EP1St <= `DO_TRANS_WT_TRANS_DONE_WT_GNT; + next_wb_stb <= 1'b0; + if (dataSeq == 1'b1) + next_dataSeq <= 1'b0; + else + next_dataSeq <= 1'b1; + next_transDone <= 1'b0; + end + end + `DO_TRANS_WR_TX_FIFO2: + begin + next_wb_data_o <= 8'h01; + next_wb_stb <= 1'b1; + if (wb_ack == 1'b1) + begin + NextState_EP1St <= `DO_TRANS_WR_TX_FIFO3; + next_wb_stb <= 1'b0; + end + end + `DO_TRANS_WR_TX_FIFO3: + begin + next_wb_data_o <= 8'h01; + next_wb_stb <= 1'b1; + if (wb_ack == 1'b1) + begin + NextState_EP1St <= `DO_TRANS_TRANS_GO; + next_wb_stb <= 1'b0; + end + end + `DO_TRANS_WT_TRANS_DONE_WT_GNT: + begin + next_wbBusReq <= 1'b1; + if (wbBusGnt == 1'b1) + begin + NextState_EP1St <= `DO_TRANS_WT_TRANS_DONE_GET_RDY_STS; + end + end + `DO_TRANS_WT_TRANS_DONE_GET_RDY_STS: + begin + next_wb_addr <= `RA_EP1_CONTROL_REG; + next_wb_stb <= 1'b1; + next_wb_we <= 1'b0; + if (wb_ack == 1'b1) + begin + NextState_EP1St <= `DO_TRANS_WT_TRANS_DONE_WT_UNGNT; + next_wb_stb <= 1'b0; + next_transDone <= ~wb_data_i[`ENDPOINT_READY_BIT]; + end + end + `DO_TRANS_WT_TRANS_DONE_WT_UNGNT: + begin + next_wbBusReq <= 1'b0; + if (wbBusGnt == 1'b0) + begin + NextState_EP1St <= `DO_TRANS_WT_TRANS_DONE_CHK_DONE; + end + end + `DO_TRANS_WT_TRANS_DONE_CHK_DONE: + begin + if (transDone == 1'b1) + begin + NextState_EP1St <= `DO_TRANS_WT_GNT; + end + else + begin + NextState_EP1St <= `DO_TRANS_WT_TRANS_DONE_DEL; + next_cnt <= 8'h00; + end + end + `DO_TRANS_WT_TRANS_DONE_DEL: + begin + next_cnt <= cnt + 1'b1; + if (cnt == `ONE_USEC_DEL) + begin + NextState_EP1St <= `DO_TRANS_WT_TRANS_DONE_WT_GNT; + end + end + endcase +end + +// Current State Logic (sequential) +always @ (posedge clk) +begin + if (rst == 1'b1) + CurrState_EP1St <= `START; + else + CurrState_EP1St <= NextState_EP1St; +end + +// Registered outputs logic +always @ (posedge clk) +begin + if (rst == 1'b1) + begin + wbBusReq <= 1'b0; + wb_addr <= 8'h00; + wb_data_o <= 8'h00; + wb_stb <= 1'b0; + wb_we <= 1'b0; + dataSeq <= 1'b0; + transDone <= 1'b0; + cnt <= 8'h00; + end + else + begin + wbBusReq <= next_wbBusReq; + wb_addr <= next_wb_addr; + wb_data_o <= next_wb_data_o; + wb_stb <= next_wb_stb; + wb_we <= next_wb_we; + dataSeq <= next_dataSeq; + transDone <= next_transDone; + cnt <= next_cnt; + end +end + +endmodule \ No newline at end of file Index: Actel/usbDeviceActelTop/hdl/TxFifo.v =================================================================== --- Actel/usbDeviceActelTop/hdl/TxFifo.v (nonexistent) +++ Actel/usbDeviceActelTop/hdl/TxFifo.v (revision 40) @@ -0,0 +1,132 @@ +////////////////////////////////////////////////////////////////////// +//// //// +//// TxFifo.v //// +//// //// +//// This file is part of the usbhostslave opencores effort. +//// //// +//// //// +//// Module Description: //// +//// parameterized TxFifo wrapper. Min depth = 2, Max depth = 65536 +//// fifo write access via bus interface, fifo read access is direct +//// +//// //// +//// To Do: //// +//// +//// //// +//// Author(s): //// +//// - Steve Fielding, sfielding@base2designs.com //// +//// //// +////////////////////////////////////////////////////////////////////// +//// //// +//// Copyright (C) 2004 Steve Fielding and OPENCORES.ORG //// +//// //// +//// This source file may be used and distributed without //// +//// restriction provided that this copyright statement is not //// +//// removed from the file and that any derivative work contains //// +//// the original copyright notice and the associated disclaimer. //// +//// //// +//// This source file is free software; you can redistribute it //// +//// and/or modify it under the terms of the GNU Lesser General //// +//// Public License as published by the Free Software Foundation; //// +//// either version 2.1 of the License, or (at your option) any //// +//// later version. //// +//// //// +//// This source is distributed in the hope that it will be //// +//// useful, but WITHOUT ANY WARRANTY; without even the implied //// +//// warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR //// +//// PURPOSE. See the GNU Lesser General Public License for more //// +//// details. //// +//// //// +//// You should have received a copy of the GNU Lesser General //// +//// Public License along with this source; if not, download it //// +//// from //// +//// //// +////////////////////////////////////////////////////////////////////// +// +`include "timescale.v" + +module TxFifo( + busClk, + usbClk, + rstSyncToBusClk, + rstSyncToUsbClk, + fifoREn, + fifoEmpty, + busAddress, + busWriteEn, + busStrobe_i, + busFifoSelect, + busDataIn, + busDataOut, + fifoDataOut ); + //FIFO_DEPTH = ADDR_WIDTH^2 + parameter FIFO_DEPTH = 64; + parameter ADDR_WIDTH = 6; + +input busClk; +input usbClk; +input rstSyncToBusClk; +input rstSyncToUsbClk; +input fifoREn; +output fifoEmpty; +input [2:0] busAddress; +input busWriteEn; +input busStrobe_i; +input busFifoSelect; +input [7:0] busDataIn; +output [7:0] busDataOut; +output [7:0] fifoDataOut; + +wire busClk; +wire usbClk; +wire rstSyncToBusClk; +wire rstSyncToUsbClk; +wire fifoREn; +wire fifoEmpty; +wire [2:0] busAddress; +wire busWriteEn; +wire busStrobe_i; +wire busFifoSelect; +wire [7:0] busDataIn; +wire [7:0] busDataOut; +wire [7:0] fifoDataOut; + +//internal wires and regs +wire fifoWEn; +wire forceEmptySyncToUsbClk; +wire forceEmptySyncToBusClk; +wire [15:0] numElementsInFifo; +wire fifoFull; + +fifoRTL #(8, FIFO_DEPTH, ADDR_WIDTH) u_fifo( + .wrClk(busClk), + .rdClk(usbClk), + .rstSyncToWrClk(rstSyncToBusClk), + .rstSyncToRdClk(rstSyncToUsbClk), + .dataIn(busDataIn), + .dataOut(fifoDataOut), + .fifoWEn(fifoWEn), + .fifoREn(fifoREn), + .fifoFull(fifoFull), + .fifoEmpty(fifoEmpty), + .forceEmptySyncToWrClk(forceEmptySyncToBusClk), + .forceEmptySyncToRdClk(forceEmptySyncToUsbClk), + .numElementsInFifo(numElementsInFifo) ); + +TxfifoBI u_TxfifoBI( + .address(busAddress), + .writeEn(busWriteEn), + .strobe_i(busStrobe_i), + .busClk(busClk), + .usbClk(usbClk), + .rstSyncToBusClk(rstSyncToBusClk), + .fifoSelect(busFifoSelect), + .busDataIn(busDataIn), + .busDataOut(busDataOut), + .fifoWEn(fifoWEn), + .forceEmptySyncToBusClk(forceEmptySyncToBusClk), + .forceEmptySyncToUsbClk(forceEmptySyncToUsbClk), + .numElementsInFifo(numElementsInFifo) + ); + +endmodule Index: Actel/usbDeviceActelTop/hdl/wishBoneBus_h.v =================================================================== --- Actel/usbDeviceActelTop/hdl/wishBoneBus_h.v (nonexistent) +++ Actel/usbDeviceActelTop/hdl/wishBoneBus_h.v (revision 40) @@ -0,0 +1,35 @@ +////////////////////////////////////////////////////////////////////// +// wishBoneBus_h.v +////////////////////////////////////////////////////////////////////// + +`ifdef wishBoneBus_h_vdefined +`else +`define wishBoneBus_h_vdefined + +//memoryMap +`define HCREG_BASE 8'h00 +`define HCREG_BASE_PLUS_0X10 8'h10 +`define HOST_RX_FIFO_BASE 8'h20 +`define HOST_TX_FIFO_BASE 8'h30 +`define SCREG_BASE 8'h40 +`define SCREG_BASE_PLUS_0X10 8'h50 +`define EP0_RX_FIFO_BASE 8'h60 +`define EP0_TX_FIFO_BASE 8'h70 +`define EP1_RX_FIFO_BASE 8'h80 +`define EP1_TX_FIFO_BASE 8'h90 +`define EP2_RX_FIFO_BASE 8'ha0 +`define EP2_TX_FIFO_BASE 8'hb0 +`define EP3_RX_FIFO_BASE 8'hc0 +`define EP3_TX_FIFO_BASE 8'hd0 +`define HOST_SLAVE_CONTROL_BASE 8'he0 +`define ADDRESS_DECODE_MASK 8'hf0 + +//FifoAddresses +`define FIFO_DATA_REG 3'b000 +`define FIFO_STATUS_REG 3'b001 +`define FIFO_DATA_COUNT_MSB 3'b010 +`define FIFO_DATA_COUNT_LSB 3'b011 +`define FIFO_CONTROL_REG 3'b100 + +`endif //wishBoneBus_h_vdefined + Index: Actel/usbDeviceActelTop/hdl/USBSlaveControlBI.v =================================================================== --- Actel/usbDeviceActelTop/hdl/USBSlaveControlBI.v (nonexistent) +++ Actel/usbDeviceActelTop/hdl/USBSlaveControlBI.v (revision 40) @@ -0,0 +1,714 @@ +////////////////////////////////////////////////////////////////////// +//// //// +//// USBSlaveControlBI.v //// +//// //// +//// This file is part of the usbhostslave opencores effort. +//// //// +//// //// +//// Module Description: //// +//// +//// //// +//// To Do: //// +//// +//// //// +//// Author(s): //// +//// - Steve Fielding, sfielding@base2designs.com //// +//// //// +////////////////////////////////////////////////////////////////////// +//// //// +//// Copyright (C) 2004 Steve Fielding and OPENCORES.ORG //// +//// //// +//// This source file may be used and distributed without //// +//// restriction provided that this copyright statement is not //// +//// removed from the file and that any derivative work contains //// +//// the original copyright notice and the associated disclaimer. //// +//// //// +//// This source file is free software; you can redistribute it //// +//// and/or modify it under the terms of the GNU Lesser General //// +//// Public License as published by the Free Software Foundation; //// +//// either version 2.1 of the License, or (at your option) any //// +//// later version. //// +//// //// +//// This source is distributed in the hope that it will be //// +//// useful, but WITHOUT ANY WARRANTY; without even the implied //// +//// warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR //// +//// PURPOSE. See the GNU Lesser General Public License for more //// +//// details. //// +//// //// +//// You should have received a copy of the GNU Lesser General //// +//// Public License along with this source; if not, download it //// +//// from //// +//// //// +////////////////////////////////////////////////////////////////////// +// +`include "timescale.v" +`include "usbSlaveControl_h.v" + +module USBSlaveControlBI (address, dataIn, dataOut, writeEn, + strobe_i, + busClk, + rstSyncToBusClk, + usbClk, + rstSyncToUsbClk, + SOFRxedIntOut, resetEventIntOut, resumeIntOut, transDoneIntOut, NAKSentIntOut, vBusDetIntOut, + endP0TransTypeReg, endP0NAKTransTypeReg, + endP1TransTypeReg, endP1NAKTransTypeReg, + endP2TransTypeReg, endP2NAKTransTypeReg, + endP3TransTypeReg, endP3NAKTransTypeReg, + endP0ControlReg, + endP1ControlReg, + endP2ControlReg, + endP3ControlReg, + EP0StatusReg, + EP1StatusReg, + EP2StatusReg, + EP3StatusReg, + SCAddrReg, frameNum, + connectStateIn, + vBusDetectIn, + SOFRxedIn, resetEventIn, resumeIntIn, transDoneIn, NAKSentIn, + slaveControlSelect, + clrEP0Ready, clrEP1Ready, clrEP2Ready, clrEP3Ready, + TxLineState, + LineDirectControlEn, + fullSpeedPol, + fullSpeedRate, + connectSlaveToHost, + SCGlobalEn + ); +input [4:0] address; +input [7:0] dataIn; +input writeEn; +input strobe_i; +input busClk; +input rstSyncToBusClk; +input usbClk; +input rstSyncToUsbClk; +output [7:0] dataOut; +output SOFRxedIntOut; +output resetEventIntOut; +output resumeIntOut; +output transDoneIntOut; +output NAKSentIntOut; +output vBusDetIntOut; + +input [1:0] endP0TransTypeReg; +input [1:0] endP0NAKTransTypeReg; +input [1:0] endP1TransTypeReg; +input [1:0] endP1NAKTransTypeReg; +input [1:0] endP2TransTypeReg; +input [1:0] endP2NAKTransTypeReg; +input [1:0] endP3TransTypeReg; +input [1:0] endP3NAKTransTypeReg; +output [4:0] endP0ControlReg; +output [4:0] endP1ControlReg; +output [4:0] endP2ControlReg; +output [4:0] endP3ControlReg; +input [7:0] EP0StatusReg; +input [7:0] EP1StatusReg; +input [7:0] EP2StatusReg; +input [7:0] EP3StatusReg; +output [6:0] SCAddrReg; +input [10:0] frameNum; +input [1:0] connectStateIn; +input vBusDetectIn; +input SOFRxedIn; +input resetEventIn; +input resumeIntIn; +input transDoneIn; +input NAKSentIn; +input slaveControlSelect; +input clrEP0Ready; +input clrEP1Ready; +input clrEP2Ready; +input clrEP3Ready; +output [1:0] TxLineState; +output LineDirectControlEn; +output fullSpeedPol; +output fullSpeedRate; +output connectSlaveToHost; +output SCGlobalEn; + +wire [4:0] address; +wire [7:0] dataIn; +wire writeEn; +wire strobe_i; +wire busClk; +wire rstSyncToBusClk; +wire usbClk; +wire rstSyncToUsbClk; +reg [7:0] dataOut; + +reg SOFRxedIntOut; +reg resetEventIntOut; +reg resumeIntOut; +reg transDoneIntOut; +reg NAKSentIntOut; +reg vBusDetIntOut; + +wire [1:0] endP0TransTypeReg; +wire [1:0] endP0NAKTransTypeReg; +wire [1:0] endP1TransTypeReg; +wire [1:0] endP1NAKTransTypeReg; +wire [1:0] endP2TransTypeReg; +wire [1:0] endP2NAKTransTypeReg; +wire [1:0] endP3TransTypeReg; +wire [1:0] endP3NAKTransTypeReg; +reg [4:0] endP0ControlReg; +reg [4:0] endP0ControlReg1; +reg [4:0] endP1ControlReg; +reg [4:0] endP1ControlReg1; +reg [4:0] endP2ControlReg; +reg [4:0] endP2ControlReg1; +reg [4:0] endP3ControlReg; +reg [4:0] endP3ControlReg1; +wire [7:0] EP0StatusReg; +wire [7:0] EP1StatusReg; +wire [7:0] EP2StatusReg; +wire [7:0] EP3StatusReg; +reg [6:0] SCAddrReg; +reg [3:0] TxEndPReg; +wire [10:0] frameNum; +wire [1:0] connectStateIn; + +wire SOFRxedIn; +wire resetEventIn; +wire resumeIntIn; +wire transDoneIn; +wire NAKSentIn; +wire slaveControlSelect; +wire clrEP0Ready; +wire clrEP1Ready; +wire clrEP2Ready; +wire clrEP3Ready; +reg [1:0] TxLineState; +reg [1:0] TxLineState_reg1; +reg LineDirectControlEn; +reg LineDirectControlEn_reg1; +reg fullSpeedPol; +reg fullSpeedPol_reg1; +reg fullSpeedRate; +reg fullSpeedRate_reg1; +reg connectSlaveToHost; +reg connectSlaveToHost_reg1; +reg SCGlobalEn; +reg SCGlobalEn_reg1; + +//internal wire and regs +reg [6:0] SCControlReg; +reg clrVBusDetReq; +reg clrNAKReq; +reg clrSOFReq; +reg clrResetReq; +reg clrResInReq; +reg clrTransDoneReq; +reg SOFRxedInt; +reg resetEventInt; +reg resumeInt; +reg transDoneInt; +reg vBusDetInt; +reg NAKSentInt; +reg [5:0] interruptMaskReg; +reg EP0SetReady; +reg EP1SetReady; +reg EP2SetReady; +reg EP3SetReady; +reg EP0SendStall; +reg EP1SendStall; +reg EP2SendStall; +reg EP3SendStall; +reg EP0IsoEn; +reg EP1IsoEn; +reg EP2IsoEn; +reg EP3IsoEn; +reg EP0DataSequence; +reg EP1DataSequence; +reg EP2DataSequence; +reg EP3DataSequence; +reg EP0Enable; +reg EP1Enable; +reg EP2Enable; +reg EP3Enable; +reg EP0Ready; +reg EP1Ready; +reg EP2Ready; +reg EP3Ready; +reg [2:0] SOFRxedInExtend; +reg [2:0] resetEventInExtend; +reg [2:0] resumeIntInExtend; +reg [2:0] transDoneInExtend; +reg [2:0] NAKSentInExtend; +reg [2:0] clrEP0ReadyExtend; +reg [2:0] clrEP1ReadyExtend; +reg [2:0] clrEP2ReadyExtend; +reg [2:0] clrEP3ReadyExtend; + + +//clock domain crossing sync registers +//STB = Sync To Busclk +reg [4:0] endP0ControlRegSTB; +reg [4:0] endP1ControlRegSTB; +reg [4:0] endP2ControlRegSTB; +reg [4:0] endP3ControlRegSTB; +reg [2:0] NAKSentInSTB; +reg [2:0] SOFRxedInSTB; +reg [2:0] resetEventInSTB; +reg [2:0] resumeIntInSTB; +reg [2:0] transDoneInSTB; +reg [2:0] clrEP0ReadySTB; +reg [2:0] clrEP1ReadySTB; +reg [2:0] clrEP2ReadySTB; +reg [2:0] clrEP3ReadySTB; +reg SCGlobalEnSTB; +reg [1:0] TxLineStateSTB; +reg LineDirectControlEnSTB; +reg fullSpeedPolSTB; +reg fullSpeedRateSTB; +reg connectSlaveToHostSTB; +reg [7:0] EP0StatusRegSTB; +reg [7:0] EP0StatusRegSTB_reg1; +reg [7:0] EP1StatusRegSTB; +reg [7:0] EP1StatusRegSTB_reg1; +reg [7:0] EP2StatusRegSTB; +reg [7:0] EP2StatusRegSTB_reg1; +reg [7:0] EP3StatusRegSTB; +reg [7:0] EP3StatusRegSTB_reg1; +reg [1:0] endP0TransTypeRegSTB; +reg [1:0] endP0TransTypeRegSTB_reg1; +reg [1:0] endP0NAKTransTypeRegSTB; +reg [1:0] endP0NAKTransTypeRegSTB_reg1; +reg [1:0] endP1TransTypeRegSTB; +reg [1:0] endP1TransTypeRegSTB_reg1; +reg [1:0] endP1NAKTransTypeRegSTB; +reg [1:0] endP1NAKTransTypeRegSTB_reg1; +reg [1:0] endP2TransTypeRegSTB; +reg [1:0] endP2TransTypeRegSTB_reg1; +reg [1:0] endP2NAKTransTypeRegSTB; +reg [1:0] endP2NAKTransTypeRegSTB_reg1; +reg [1:0] endP3TransTypeRegSTB; +reg [1:0] endP3TransTypeRegSTB_reg1; +reg [1:0] endP3NAKTransTypeRegSTB; +reg [1:0] endP3NAKTransTypeRegSTB_reg1; +reg [10:0] frameNumSTB; +reg [10:0] frameNumSTB_reg1; +reg [2:0] vBusDetectInSTB; +reg [1:0] connectStateInSTB; +reg [1:0] connectStateInSTB_reg1; + + +//sync write demux +always @(posedge busClk) +begin + if (rstSyncToBusClk == 1'b1) begin + EP0IsoEn <= 1'b0; + EP0SendStall <= 1'b0; + EP0DataSequence <= 1'b0; + EP0Enable <= 1'b0; + EP1IsoEn <= 1'b0; + EP1SendStall <= 1'b0; + EP1DataSequence <= 1'b0; + EP1Enable <= 1'b0; + EP2IsoEn <= 1'b0; + EP2SendStall <= 1'b0; + EP2DataSequence <= 1'b0; + EP2Enable <= 1'b0; + EP3IsoEn <= 1'b0; + EP3SendStall <= 1'b0; + EP3DataSequence <= 1'b0; + EP3Enable <= 1'b0; + SCControlReg <= 7'h00; + SCAddrReg <= 7'h00; + interruptMaskReg <= 6'h00; + end + else begin + clrVBusDetReq <= 1'b0; + clrNAKReq <= 1'b0; + clrSOFReq <= 1'b0; + clrResetReq <= 1'b0; + clrResInReq <= 1'b0; + clrTransDoneReq <= 1'b0; + EP0SetReady <= 1'b0; + EP1SetReady <= 1'b0; + EP2SetReady <= 1'b0; + EP3SetReady <= 1'b0; + if (writeEn == 1'b1 && strobe_i == 1'b1 && slaveControlSelect == 1'b1) + begin + case (address) + `EP0_CTRL_REG : begin + EP0IsoEn <= dataIn[`ENDPOINT_ISO_ENABLE_BIT]; + EP0SendStall <= dataIn[`ENDPOINT_SEND_STALL_BIT]; + EP0DataSequence <= dataIn[`ENDPOINT_OUTDATA_SEQUENCE_BIT]; + EP0SetReady <= dataIn[`ENDPOINT_READY_BIT]; + EP0Enable <= dataIn[`ENDPOINT_ENABLE_BIT]; + end + `EP1_CTRL_REG : begin + EP1IsoEn <= dataIn[`ENDPOINT_ISO_ENABLE_BIT]; + EP1SendStall <= dataIn[`ENDPOINT_SEND_STALL_BIT]; + EP1DataSequence <= dataIn[`ENDPOINT_OUTDATA_SEQUENCE_BIT]; + EP1SetReady <= dataIn[`ENDPOINT_READY_BIT]; + EP1Enable <= dataIn[`ENDPOINT_ENABLE_BIT]; + end + `EP2_CTRL_REG : begin + EP2IsoEn <= dataIn[`ENDPOINT_ISO_ENABLE_BIT]; + EP2SendStall <= dataIn[`ENDPOINT_SEND_STALL_BIT]; + EP2DataSequence <= dataIn[`ENDPOINT_OUTDATA_SEQUENCE_BIT]; + EP2SetReady <= dataIn[`ENDPOINT_READY_BIT]; + EP2Enable <= dataIn[`ENDPOINT_ENABLE_BIT]; + end + `EP3_CTRL_REG : begin + EP3IsoEn <= dataIn[`ENDPOINT_ISO_ENABLE_BIT]; + EP3SendStall <= dataIn[`ENDPOINT_SEND_STALL_BIT]; + EP3DataSequence <= dataIn[`ENDPOINT_OUTDATA_SEQUENCE_BIT]; + EP3SetReady <= dataIn[`ENDPOINT_READY_BIT]; + EP3Enable <= dataIn[`ENDPOINT_ENABLE_BIT]; + end + `SC_CONTROL_REG : SCControlReg <= dataIn[6:0]; + `SC_ADDRESS : SCAddrReg <= dataIn[6:0]; + `SC_INTERRUPT_STATUS_REG : begin + clrVBusDetReq <= dataIn[`VBUS_DET_INT_BIT]; + clrNAKReq <= dataIn[`NAK_SENT_INT_BIT]; + clrSOFReq <= dataIn[`SOF_RECEIVED_BIT]; + clrResetReq <= dataIn[`RESET_EVENT_BIT]; + clrResInReq <= dataIn[`RESUME_INT_BIT]; + clrTransDoneReq <= dataIn[`TRANS_DONE_BIT]; + end + `SC_INTERRUPT_MASK_REG : interruptMaskReg <= dataIn[5:0]; + endcase + end + end +end + +//interrupt control +always @(posedge busClk) +begin + if (rstSyncToBusClk == 1'b1) begin + vBusDetInt <= 1'b0; + NAKSentInt <= 1'b0; + SOFRxedInt <= 1'b0; + resetEventInt <= 1'b0; + resumeInt <= 1'b0; + transDoneInt <= 1'b0; + end + else begin + if (vBusDetectInSTB[0] != vBusDetectInSTB[1]) + vBusDetInt <= 1'b1; + else if (clrVBusDetReq == 1'b1) + vBusDetInt <= 1'b0; + + if (NAKSentInSTB[1] == 1'b1 && NAKSentInSTB[0] == 1'b0) + NAKSentInt <= 1'b1; + else if (clrNAKReq == 1'b1) + NAKSentInt <= 1'b0; + + if (SOFRxedInSTB[1] == 1'b1 && SOFRxedInSTB[0] == 1'b0) + SOFRxedInt <= 1'b1; + else if (clrSOFReq == 1'b1) + SOFRxedInt <= 1'b0; + + if (resetEventInSTB[1] == 1'b1 && resetEventInSTB[0] == 1'b0) + resetEventInt <= 1'b1; + else if (clrResetReq == 1'b1) + resetEventInt <= 1'b0; + + if (resumeIntInSTB[1] == 1'b1 && resumeIntInSTB[0] == 1'b0) + resumeInt <= 1'b1; + else if (clrResInReq == 1'b1) + resumeInt <= 1'b0; + + if (transDoneInSTB[1] == 1'b1 && transDoneInSTB[0] == 1'b0) + transDoneInt <= 1'b1; + else if (clrTransDoneReq == 1'b1) + transDoneInt <= 1'b0; + end +end + +//mask interrupts +always @(*) begin + transDoneIntOut <= transDoneInt & interruptMaskReg[`TRANS_DONE_BIT]; + resumeIntOut <= resumeInt & interruptMaskReg[`RESUME_INT_BIT]; + resetEventIntOut <= resetEventInt & interruptMaskReg[`RESET_EVENT_BIT]; + SOFRxedIntOut <= SOFRxedInt & interruptMaskReg[`SOF_RECEIVED_BIT]; + NAKSentIntOut <= NAKSentInt & interruptMaskReg[`NAK_SENT_INT_BIT]; + vBusDetIntOut <= vBusDetInt & interruptMaskReg[`VBUS_DET_INT_BIT]; +end + +//end point ready, set/clear +//Since 'busClk' can be a higher freq than 'usbClk', +//'EP0SetReady' etc must be delayed with respect to other control signals, thus +//ensuring that control signals have been clocked through to 'usbClk' clock +//domain before the ready is asserted. +//Not sure this is required because there is at least two 'usbClk' ticks between +//detection of 'EP0Ready' and sampling of related control signals. +always @(posedge busClk) +begin + if (rstSyncToBusClk == 1'b1) begin + EP0Ready <= 1'b0; + EP1Ready <= 1'b0; + EP2Ready <= 1'b0; + EP3Ready <= 1'b0; + end + else begin + if (EP0SetReady == 1'b1) + EP0Ready <= 1'b1; + else if (clrEP0ReadySTB[1] == 1'b1 && clrEP0ReadySTB[0] == 1'b0) + EP0Ready <= 1'b0; + + if (EP1SetReady == 1'b1) + EP1Ready <= 1'b1; + else if (clrEP1ReadySTB[1] == 1'b1 && clrEP1ReadySTB[0] == 1'b0) + EP1Ready <= 1'b0; + + if (EP2SetReady == 1'b1) + EP2Ready <= 1'b1; + else if (clrEP2ReadySTB[1] == 1'b1 && clrEP2ReadySTB[0] == 1'b0) + EP2Ready <= 1'b0; + + if (EP3SetReady == 1'b1) + EP3Ready <= 1'b1; + else if (clrEP3ReadySTB[1] == 1'b1 && clrEP3ReadySTB[0] == 1'b0) + EP3Ready <= 1'b0; + end +end + +//break out control signals +always @(SCControlReg) begin + SCGlobalEnSTB <= SCControlReg[`SC_GLOBAL_ENABLE_BIT]; + TxLineStateSTB <= SCControlReg[`SC_TX_LINE_STATE_MSBIT:`SC_TX_LINE_STATE_LSBIT]; + LineDirectControlEnSTB <= SCControlReg[`SC_DIRECT_CONTROL_BIT]; + fullSpeedPolSTB <= SCControlReg[`SC_FULL_SPEED_LINE_POLARITY_BIT]; + fullSpeedRateSTB <= SCControlReg[`SC_FULL_SPEED_LINE_RATE_BIT]; + connectSlaveToHostSTB <= SCControlReg[`SC_CONNECT_TO_HOST_BIT]; +end + +//combine endpoint control signals +always @(*) +begin + endP0ControlRegSTB <= {EP0IsoEn, EP0SendStall, EP0DataSequence, EP0Ready, EP0Enable}; + endP1ControlRegSTB <= {EP1IsoEn, EP1SendStall, EP1DataSequence, EP1Ready, EP1Enable}; + endP2ControlRegSTB <= {EP2IsoEn, EP2SendStall, EP2DataSequence, EP2Ready, EP2Enable}; + endP3ControlRegSTB <= {EP3IsoEn, EP3SendStall, EP3DataSequence, EP3Ready, EP3Enable}; +end + + +// async read mux +always @(*) +begin + case (address) + `EP0_CTRL_REG : dataOut <= endP0ControlRegSTB; + `EP0_STS_REG : dataOut <= EP0StatusRegSTB; + `EP0_TRAN_TYPE_STS_REG : dataOut <= endP0TransTypeRegSTB; + `EP0_NAK_TRAN_TYPE_STS_REG : dataOut <= endP0NAKTransTypeRegSTB; + `EP1_CTRL_REG : dataOut <= endP1ControlRegSTB; + `EP1_STS_REG : dataOut <= EP1StatusRegSTB; + `EP1_TRAN_TYPE_STS_REG : dataOut <= endP1TransTypeRegSTB; + `EP1_NAK_TRAN_TYPE_STS_REG : dataOut <= endP1NAKTransTypeRegSTB; + `EP2_CTRL_REG : dataOut <= endP2ControlRegSTB; + `EP2_STS_REG : dataOut <= EP2StatusRegSTB; + `EP2_TRAN_TYPE_STS_REG : dataOut <= endP2TransTypeRegSTB; + `EP2_NAK_TRAN_TYPE_STS_REG : dataOut <= endP2NAKTransTypeRegSTB; + `EP3_CTRL_REG : dataOut <= endP3ControlRegSTB; + `EP3_STS_REG : dataOut <= EP3StatusRegSTB; + `EP3_TRAN_TYPE_STS_REG : dataOut <= endP3TransTypeRegSTB; + `EP3_NAK_TRAN_TYPE_STS_REG : dataOut <= endP3NAKTransTypeRegSTB; + `SC_CONTROL_REG : dataOut <= SCControlReg; + `SC_LINE_STATUS_REG : dataOut <= {5'b00000, vBusDetectInSTB[0], connectStateInSTB}; + `SC_INTERRUPT_STATUS_REG : dataOut <= {2'b00, vBusDetInt, NAKSentInt, SOFRxedInt, resetEventInt, resumeInt, transDoneInt}; + `SC_INTERRUPT_MASK_REG : dataOut <= {2'b00, interruptMaskReg}; + `SC_ADDRESS : dataOut <= {1'b0, SCAddrReg}; + `SC_FRAME_NUM_MSP : dataOut <= {5'b00000, frameNumSTB[10:8]}; + `SC_FRAME_NUM_LSP : dataOut <= frameNumSTB[7:0]; + default: dataOut <= 8'h00; + endcase +end + + +//Extend SOFRxedIn, resetEventIn, resumeIntIn, transDoneIn, NAKSentIn from 1 tick +//pulses to 3 tick pulses +always @(posedge usbClk) begin + if (rstSyncToUsbClk == 1'b1) begin + SOFRxedInExtend <= 3'b000; + resetEventInExtend <= 3'b000; + resumeIntInExtend <= 3'b000; + transDoneInExtend <= 3'b000; + NAKSentInExtend <= 3'b000; + clrEP0ReadyExtend <= 3'b000; + clrEP1ReadyExtend <= 3'b000; + clrEP2ReadyExtend <= 3'b000; + clrEP3ReadyExtend <= 3'b000; + end + else begin + if (SOFRxedIn == 1'b1) + SOFRxedInExtend <= 3'b111; + else + SOFRxedInExtend <= {1'b0, SOFRxedInExtend[2:1]}; + if (resetEventIn == 1'b1) + resetEventInExtend <= 3'b111; + else + resetEventInExtend <= {1'b0, resetEventInExtend[2:1]}; + if (resumeIntIn == 1'b1) + resumeIntInExtend <= 3'b111; + else + resumeIntInExtend <= {1'b0, resumeIntInExtend[2:1]}; + if (transDoneIn == 1'b1) + transDoneInExtend <= 3'b111; + else + transDoneInExtend <= {1'b0, transDoneInExtend[2:1]}; + if (NAKSentIn == 1'b1) + NAKSentInExtend <= 3'b111; + else + NAKSentInExtend <= {1'b0, NAKSentInExtend[2:1]}; + if (clrEP0Ready == 1'b1) + clrEP0ReadyExtend <= 3'b111; + else + clrEP0ReadyExtend <= {1'b0, clrEP0ReadyExtend[2:1]}; + if (clrEP1Ready == 1'b1) + clrEP1ReadyExtend <= 3'b111; + else + clrEP1ReadyExtend <= {1'b0, clrEP1ReadyExtend[2:1]}; + if (clrEP2Ready == 1'b1) + clrEP2ReadyExtend <= 3'b111; + else + clrEP2ReadyExtend <= {1'b0, clrEP2ReadyExtend[2:1]}; + if (clrEP3Ready == 1'b1) + clrEP3ReadyExtend <= 3'b111; + else + clrEP3ReadyExtend <= {1'b0, clrEP3ReadyExtend[2:1]}; + end +end + +//re-sync from busClk to usbClk. +always @(posedge usbClk) begin + if (rstSyncToUsbClk == 1'b1) begin + endP0ControlReg <= {5{1'b0}}; + endP0ControlReg1 <= {5{1'b0}}; + endP1ControlReg <= {5{1'b0}}; + endP1ControlReg1 <= {5{1'b0}}; + endP2ControlReg <= {5{1'b0}}; + endP2ControlReg1 <= {5{1'b0}}; + endP3ControlReg <= {5{1'b0}}; + endP3ControlReg1 <= {5{1'b0}}; + SCGlobalEn <= 1'b0; + SCGlobalEn_reg1 <= 1'b0; + TxLineState <= 2'b00; + TxLineState_reg1 <= 2'b00; + LineDirectControlEn <= 1'b0; + LineDirectControlEn_reg1 <= 1'b0; + fullSpeedPol <= 1'b0; + fullSpeedPol_reg1 <= 1'b0; + fullSpeedRate <= 1'b0; + fullSpeedRate_reg1 <= 1'b0; + connectSlaveToHost <= 1'b0; + connectSlaveToHost_reg1 <= 1'b0; + end + else begin + endP0ControlReg1 <= endP0ControlRegSTB; + endP0ControlReg <= endP0ControlReg1; + endP1ControlReg1 <= endP1ControlRegSTB; + endP1ControlReg <= endP1ControlReg1; + endP2ControlReg1 <= endP2ControlRegSTB; + endP2ControlReg <= endP2ControlReg1; + endP3ControlReg1 <= endP3ControlRegSTB; + endP3ControlReg <= endP3ControlReg1; + SCGlobalEn_reg1 <= SCGlobalEnSTB; + SCGlobalEn <= SCGlobalEn_reg1; + TxLineState_reg1 <= TxLineStateSTB; + TxLineState <= TxLineState_reg1; + LineDirectControlEn_reg1 <= LineDirectControlEnSTB; + LineDirectControlEn <= LineDirectControlEn_reg1; + fullSpeedPol_reg1 <= fullSpeedPolSTB; + fullSpeedPol <= fullSpeedPol_reg1; + fullSpeedRate_reg1 <= fullSpeedRateSTB; + fullSpeedRate <= fullSpeedRate_reg1; + connectSlaveToHost_reg1 <= connectSlaveToHostSTB; + connectSlaveToHost <= connectSlaveToHost_reg1; + end +end + +//re-sync from usbClk and async inputs to busClk. Since 'NAKSentIn', 'SOFRxedIn' etc +//are only asserted for 3 usbClk ticks +//busClk freq must be greater than usbClk/3 (plus some allowance for setup and hold) freq +always @(posedge busClk) begin + if (rstSyncToBusClk == 1'b1) begin + vBusDetectInSTB <= 3'b000; + NAKSentInSTB <= 3'b000; + SOFRxedInSTB <= 3'b000; + resetEventInSTB <= 3'b000; + resumeIntInSTB <= 3'b000; + transDoneInSTB <= 3'b000; + clrEP0ReadySTB <= 3'b000; + clrEP1ReadySTB <= 3'b000; + clrEP2ReadySTB <= 3'b000; + clrEP3ReadySTB <= 3'b000; + EP0StatusRegSTB <= 8'h00; + EP0StatusRegSTB_reg1 <= 8'h00; + EP1StatusRegSTB <= 8'h00; + EP1StatusRegSTB_reg1 <= 8'h00; + EP2StatusRegSTB <= 8'h00; + EP2StatusRegSTB_reg1 <= 8'h00; + EP3StatusRegSTB <= 8'h00; + EP3StatusRegSTB_reg1 <= 8'h00; + endP0TransTypeRegSTB <= 2'b00; + endP0TransTypeRegSTB_reg1 <= 2'b00; + endP1TransTypeRegSTB <= 2'b00; + endP1TransTypeRegSTB_reg1 <= 2'b00; + endP2TransTypeRegSTB <= 2'b00; + endP2TransTypeRegSTB_reg1 <= 2'b00; + endP3TransTypeRegSTB <= 2'b00; + endP3TransTypeRegSTB_reg1 <= 2'b00; + endP0NAKTransTypeRegSTB <= 2'b00; + endP0NAKTransTypeRegSTB_reg1 <= 2'b00; + endP1NAKTransTypeRegSTB <= 2'b00; + endP1NAKTransTypeRegSTB_reg1 <= 2'b00; + endP2NAKTransTypeRegSTB <= 2'b00; + endP2NAKTransTypeRegSTB_reg1 <= 2'b00; + endP3NAKTransTypeRegSTB <= 2'b00; + endP3NAKTransTypeRegSTB_reg1 <= 2'b00; + frameNumSTB <= {11{1'b0}}; + frameNumSTB_reg1 <= {11{1'b0}}; + connectStateInSTB <= 2'b00; + connectStateInSTB_reg1 <= 2'b00; + end + else begin + vBusDetectInSTB <= {vBusDetectIn, vBusDetectInSTB[2:1]}; + NAKSentInSTB <= {NAKSentInExtend[0], NAKSentInSTB[2:1]}; + SOFRxedInSTB <= {SOFRxedInExtend[0], SOFRxedInSTB[2:1]}; + resetEventInSTB <= {resetEventInExtend[0], resetEventInSTB[2:1]}; + resumeIntInSTB <= {resumeIntInExtend[0], resumeIntInSTB[2:1]}; + transDoneInSTB <= {transDoneInExtend[0], transDoneInSTB[2:1]}; + clrEP0ReadySTB <= {clrEP0ReadyExtend[0], clrEP0ReadySTB[2:1]}; + clrEP1ReadySTB <= {clrEP1ReadyExtend[0], clrEP1ReadySTB[2:1]}; + clrEP2ReadySTB <= {clrEP2ReadyExtend[0], clrEP2ReadySTB[2:1]}; + clrEP3ReadySTB <= {clrEP3ReadyExtend[0], clrEP3ReadySTB[2:1]}; + EP0StatusRegSTB_reg1 <= EP0StatusReg; + EP0StatusRegSTB <= EP0StatusRegSTB_reg1; + EP1StatusRegSTB_reg1 <= EP1StatusReg; + EP1StatusRegSTB <= EP1StatusRegSTB_reg1; + EP2StatusRegSTB_reg1 <= EP2StatusReg; + EP2StatusRegSTB <= EP2StatusRegSTB_reg1; + EP3StatusRegSTB_reg1 <= EP3StatusReg; + EP3StatusRegSTB <= EP3StatusRegSTB_reg1; + endP0TransTypeRegSTB_reg1 <= endP0TransTypeReg; + endP0TransTypeRegSTB <= endP0TransTypeRegSTB_reg1; + endP1TransTypeRegSTB_reg1 <= endP1TransTypeReg; + endP1TransTypeRegSTB <= endP1TransTypeRegSTB_reg1; + endP2TransTypeRegSTB_reg1 <= endP2TransTypeReg; + endP2TransTypeRegSTB <= endP2TransTypeRegSTB_reg1; + endP3TransTypeRegSTB_reg1 <= endP3TransTypeReg; + endP3TransTypeRegSTB <= endP3TransTypeRegSTB_reg1; + endP0NAKTransTypeRegSTB_reg1 <= endP0NAKTransTypeReg; + endP0NAKTransTypeRegSTB <= endP0NAKTransTypeRegSTB_reg1; + endP1NAKTransTypeRegSTB_reg1 <= endP1NAKTransTypeReg; + endP1NAKTransTypeRegSTB <= endP1NAKTransTypeRegSTB_reg1; + endP2NAKTransTypeRegSTB_reg1 <= endP2NAKTransTypeReg; + endP2NAKTransTypeRegSTB <= endP2NAKTransTypeRegSTB_reg1; + endP3NAKTransTypeRegSTB_reg1 <= endP3NAKTransTypeReg; + endP3NAKTransTypeRegSTB <= endP3NAKTransTypeRegSTB_reg1; + frameNumSTB_reg1 <= frameNum; + frameNumSTB <= frameNumSTB_reg1; + connectStateInSTB_reg1 <= connectStateIn; + connectStateInSTB <= connectStateInSTB_reg1; + end +end + + +endmodule Index: Actel/usbDeviceActelTop/hdl/wishboneArb.v =================================================================== --- Actel/usbDeviceActelTop/hdl/wishboneArb.v (nonexistent) +++ Actel/usbDeviceActelTop/hdl/wishboneArb.v (revision 40) @@ -0,0 +1,218 @@ +////////////////////////////////////////////////////////////////////// +//// //// +//// wishboneArb.v //// +//// //// +//// This file is part of the usbHostSlave opencores effort. +//// //// +//// //// +//// Module Description: //// +//// Arbitrate between 3 wishbone bus controllers +//// Uses Round Robin access controller +//// +//// +//// //// +//// To Do: //// +//// +//// //// +//// Author(s): //// +//// - Steve Fielding, sfielding@base2designs.com //// +//// //// +////////////////////////////////////////////////////////////////////// +//// //// +//// Copyright (C) 2008 Steve Fielding and OPENCORES.ORG //// +//// //// +//// This source file may be used and distributed without //// +//// restriction provided that this copyright statement is not //// +//// removed from the file and that any derivative work contains //// +//// the original copyright notice and the associated disclaimer. //// +//// //// +//// This source file is free software; you can redistribute it //// +//// and/or modify it under the terms of the GNU Lesser General //// +//// Public License as published by the Free Software Foundation; //// +//// either version 2.1 of the License, or (at your option) any //// +//// later version. //// +//// //// +//// This source is distributed in the hope that it will be //// +//// useful, but WITHOUT ANY WARRANTY; without even the implied //// +//// warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR //// +//// PURPOSE. See the GNU Lesser General Public License for more //// +//// details. //// +//// //// +//// You should have received a copy of the GNU Lesser General //// +//// Public License along with this source; if not, download it //// +//// from //// +//// //// +////////////////////////////////////////////////////////////////////// +// +module wishboneArb ( + clk, + rst, + + addr0_i, + data0_i, + stb0_i, + we0_i, + req0, + gnt0, + + addr1_i, + data1_i, + stb1_i, + we1_i, + req1, + gnt1, + + addr2_i, + data2_i, + stb2_i, + we2_i, + req2, + gnt2, + + + addr_o, + data_o, + stb_o, + we_o +); + +input clk; +input rst; + +input [7:0] addr0_i; +input [7:0] data0_i; +input stb0_i; +input we0_i; +input req0; +output gnt0; +reg gnt0; + +input [7:0] addr1_i; +input [7:0] data1_i; +input stb1_i; +input we1_i; +input req1; +output gnt1; +reg gnt1; + +input [7:0] addr2_i; +input [7:0] data2_i; +input stb2_i; +input we2_i; +input req2; +output gnt2; +reg gnt2; + + +output [7:0] addr_o; +reg [7:0] addr_o; +output [7:0] data_o; +reg [7:0] data_o; +output stb_o; +reg stb_o; +output we_o; +reg we_o; + +//local wires and regs +reg [1:0] muxSel; +reg [2:0] arbSt; + +`define REQ_0 3'b000 +`define REQ_1 3'b001 +`define REQ_2 3'b010 +`define GNT_0 3'b011 +`define GNT_1 3'b100 +`define GNT_2 3'b101 + + +//arb +always @(posedge clk) begin + if (rst == 1'b1) begin + gnt0 <= 1'b0; + gnt1 <= 1'b0; + gnt2 <= 1'b0; + muxSel <= 2'b00; + arbSt <= `REQ_0; + end + else begin + case (arbSt) + `REQ_0: begin + if (req0 == 1'b1) + arbSt <= `GNT_0; + else + arbSt <= `REQ_1; + end + `REQ_1: begin + if (req1 == 1'b1) + arbSt <= `GNT_1; + else + arbSt <= `REQ_2; + end + `REQ_2: begin + if (req2 == 1'b1) + arbSt <= `GNT_2; + else + arbSt <= `REQ_0; + end + `GNT_0: begin + gnt0 <= 1'b1; + muxSel <= 2'b00; + if (req0 == 1'b0) begin + arbSt <= `REQ_1; + gnt0 <= 1'b0; + end + end + `GNT_1: begin + gnt1 <= 1'b1; + muxSel <= 2'b01; + if (req1 == 1'b0) begin + arbSt <= `REQ_2; + gnt1 <= 1'b0; + end + end + `GNT_2: begin + gnt2 <= 1'b1; + muxSel <= 2'b10; + if (req2 == 1'b0) begin + arbSt <= `REQ_0; + gnt2 <= 1'b0; + end + end + endcase + end +end + + +//mux +always @(*) begin + case (muxSel) + 2'b00: begin + addr_o <= addr0_i; + data_o <= data0_i; + stb_o <= stb0_i; + we_o <= we0_i; + end + 2'b01: begin + addr_o <= addr1_i; + data_o <= data1_i; + stb_o <= stb1_i; + we_o <= we1_i; + end + 2'b10: begin + addr_o <= addr2_i; + data_o <= data2_i; + stb_o <= stb2_i; + we_o <= we2_i; + end + default: begin + addr_o <= addr0_i; + data_o <= data0_i; + stb_o <= stb0_i; + we_o <= we0_i; + end + endcase +end + + +endmodule + Index: Actel/usbDeviceActelTop/hdl/siereceiver.v =================================================================== --- Actel/usbDeviceActelTop/hdl/siereceiver.v (nonexistent) +++ Actel/usbDeviceActelTop/hdl/siereceiver.v (revision 40) @@ -0,0 +1,283 @@ + +// File : ../RTL/serialInterfaceEngine/siereceiver.v +// Generated : 11/10/06 05:37:23 +// From : ../RTL/serialInterfaceEngine/siereceiver.asf +// By : FSM2VHDL ver. 5.0.0.9 + +////////////////////////////////////////////////////////////////////// +//// //// +//// SIEReceiver +//// //// +//// This file is part of the usbhostslave opencores effort. +//// http://www.opencores.org/cores/usbhostslave/ //// +//// //// +//// Module Description: //// +//// +//// //// +//// To Do: //// +//// +//// //// +//// Author(s): //// +//// - Steve Fielding, sfielding@base2designs.com //// +//// //// +////////////////////////////////////////////////////////////////////// +//// //// +//// Copyright (C) 2004 Steve Fielding and OPENCORES.ORG //// +//// //// +//// This source file may be used and distributed without //// +//// restriction provided that this copyright statement is not //// +//// removed from the file and that any derivative work contains //// +//// the original copyright notice and the associated disclaimer. //// +//// //// +//// This source file is free software; you can redistribute it //// +//// and/or modify it under the terms of the GNU Lesser General //// +//// Public License as published by the Free Software Foundation; //// +//// either version 2.1 of the License, or (at your option) any //// +//// later version. //// +//// //// +//// This source is distributed in the hope that it will be //// +//// useful, but WITHOUT ANY WARRANTY; without even the implied //// +//// warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR //// +//// PURPOSE. See the GNU Lesser General Public License for more //// +//// details. //// +//// //// +//// You should have received a copy of the GNU Lesser General //// +//// Public License along with this source; if not, download it //// +//// from http://www.opencores.org/lgpl.shtml //// +//// //// +////////////////////////////////////////////////////////////////////// +// +`include "timescale.v" +`include "usbSerialInterfaceEngine_h.v" + + +module SIEReceiver (RxWireDataIn, RxWireDataWEn, clk, connectState, rst); +input [1:0] RxWireDataIn; +input RxWireDataWEn; +input clk; +input rst; +output [1:0] connectState; + +wire [1:0] RxWireDataIn; +wire RxWireDataWEn; +wire clk; +reg [1:0] connectState, next_connectState; +wire rst; + +// diagram signals declarations +reg [3:0]RXStMachCurrState, next_RXStMachCurrState; +reg [7:0]RXWaitCount, next_RXWaitCount; +reg [1:0]RxBits, next_RxBits; + +// BINARY ENCODED state machine: rcvr +// State codes definitions: +`define WAIT_FS_CONN_CHK_RX_BITS 4'b0000 +`define WAIT_LS_CONN_CHK_RX_BITS 4'b0001 +`define LS_CONN_CHK_RX_BITS 4'b0010 +`define DISCNCT_CHK_RXBITS 4'b0011 +`define WAIT_BIT 4'b0100 +`define START_SRX 4'b0101 +`define FS_CONN_CHK_RX_BITS1 4'b0110 +`define WAIT_LS_DIS_CHK_RX_BITS 4'b0111 +`define WAIT_FS_DIS_CHK_RX_BITS2 4'b1000 + +reg [3:0] CurrState_rcvr; +reg [3:0] NextState_rcvr; + + +//-------------------------------------------------------------------- +// Machine: rcvr +//-------------------------------------------------------------------- +//---------------------------------- +// Next State Logic (combinatorial) +//---------------------------------- +always @ (RxWireDataIn or RxBits or RXWaitCount or RxWireDataWEn or RXStMachCurrState or connectState or CurrState_rcvr) +begin : rcvr_NextState + NextState_rcvr <= CurrState_rcvr; + // Set default values for outputs and signals + next_RxBits <= RxBits; + next_RXStMachCurrState <= RXStMachCurrState; + next_RXWaitCount <= RXWaitCount; + next_connectState <= connectState; + case (CurrState_rcvr) + `WAIT_BIT: + if ((RxWireDataWEn == 1'b1) && (RXStMachCurrState == `WAIT_LOW_SPEED_CONN_ST)) + begin + NextState_rcvr <= `WAIT_LS_CONN_CHK_RX_BITS; + next_RxBits <= RxWireDataIn; + end + else if ((RxWireDataWEn == 1'b1) && (RXStMachCurrState == `CONNECT_LOW_SPEED_ST)) + begin + NextState_rcvr <= `LS_CONN_CHK_RX_BITS; + next_RxBits <= RxWireDataIn; + end + else if ((RxWireDataWEn == 1'b1) && (RXStMachCurrState == `CONNECT_FULL_SPEED_ST)) + begin + NextState_rcvr <= `FS_CONN_CHK_RX_BITS1; + next_RxBits <= RxWireDataIn; + end + else if ((RxWireDataWEn == 1'b1) && (RXStMachCurrState == `WAIT_LOW_SP_DISCONNECT_ST)) + begin + NextState_rcvr <= `WAIT_LS_DIS_CHK_RX_BITS; + next_RxBits <= RxWireDataIn; + end + else if ((RxWireDataWEn == 1'b1) && (RXStMachCurrState == `WAIT_FULL_SP_DISCONNECT_ST)) + begin + NextState_rcvr <= `WAIT_FS_DIS_CHK_RX_BITS2; + next_RxBits <= RxWireDataIn; + end + else if ((RxWireDataWEn == 1'b1) && (RXStMachCurrState == `DISCONNECT_ST)) + begin + NextState_rcvr <= `DISCNCT_CHK_RXBITS; + next_RxBits <= RxWireDataIn; + end + else if ((RxWireDataWEn == 1'b1) && (RXStMachCurrState == `WAIT_FULL_SPEED_CONN_ST)) + begin + NextState_rcvr <= `WAIT_FS_CONN_CHK_RX_BITS; + next_RxBits <= RxWireDataIn; + end + `START_SRX: + begin + next_RXStMachCurrState <= `DISCONNECT_ST; + next_RXWaitCount <= 8'h00; + next_connectState <= `DISCONNECT; + next_RxBits <= 2'b00; + NextState_rcvr <= `WAIT_BIT; + end + `DISCNCT_CHK_RXBITS: + if (RxBits == `ZERO_ONE) + begin + NextState_rcvr <= `WAIT_BIT; + next_RXStMachCurrState <= `WAIT_LOW_SPEED_CONN_ST; + next_RXWaitCount <= 8'h00; + end + else if (RxBits == `ONE_ZERO) + begin + NextState_rcvr <= `WAIT_BIT; + next_RXStMachCurrState <= `WAIT_FULL_SPEED_CONN_ST; + next_RXWaitCount <= 8'h00; + end + else + NextState_rcvr <= `WAIT_BIT; + `WAIT_FS_CONN_CHK_RX_BITS: + begin + if (RxBits == `ONE_ZERO) + begin + next_RXWaitCount <= RXWaitCount + 1'b1; + if (RXWaitCount == `CONNECT_WAIT_TIME) + begin + next_connectState <= `FULL_SPEED_CONNECT; + next_RXStMachCurrState <= `CONNECT_FULL_SPEED_ST; + end + end + else + begin + next_RXStMachCurrState <= `DISCONNECT_ST; + end + NextState_rcvr <= `WAIT_BIT; + end + `WAIT_LS_CONN_CHK_RX_BITS: + begin + if (RxBits == `ZERO_ONE) + begin + next_RXWaitCount <= RXWaitCount + 1'b1; + if (RXWaitCount == `CONNECT_WAIT_TIME) + begin + next_connectState <= `LOW_SPEED_CONNECT; + next_RXStMachCurrState <= `CONNECT_LOW_SPEED_ST; + end + end + else + begin + next_RXStMachCurrState <= `DISCONNECT_ST; + end + NextState_rcvr <= `WAIT_BIT; + end + `LS_CONN_CHK_RX_BITS: + begin + NextState_rcvr <= `WAIT_BIT; + if (RxBits == `SE0) + begin + next_RXStMachCurrState <= `WAIT_LOW_SP_DISCONNECT_ST; + next_RXWaitCount <= 0; + end + end + `FS_CONN_CHK_RX_BITS1: + begin + NextState_rcvr <= `WAIT_BIT; + if (RxBits == `SE0) + begin + next_RXStMachCurrState <= `WAIT_FULL_SP_DISCONNECT_ST; + next_RXWaitCount <= 0; + end + end + `WAIT_LS_DIS_CHK_RX_BITS: + begin + NextState_rcvr <= `WAIT_BIT; + if (RxBits == `SE0) + begin + next_RXWaitCount <= RXWaitCount + 1'b1; + if (RXWaitCount == `DISCONNECT_WAIT_TIME) + begin + next_RXStMachCurrState <= `DISCONNECT_ST; + next_connectState <= `DISCONNECT; + end + end + else + begin + next_RXStMachCurrState <= `CONNECT_LOW_SPEED_ST; + end + end + `WAIT_FS_DIS_CHK_RX_BITS2: + begin + NextState_rcvr <= `WAIT_BIT; + if (RxBits == `SE0) + begin + next_RXWaitCount <= RXWaitCount + 1'b1; + if (RXWaitCount == `DISCONNECT_WAIT_TIME) + begin + next_RXStMachCurrState <= `DISCONNECT_ST; + next_connectState <= `DISCONNECT; + end + end + else + begin + next_RXStMachCurrState <= `CONNECT_FULL_SPEED_ST; + end + end + endcase +end + +//---------------------------------- +// Current State Logic (sequential) +//---------------------------------- +always @ (posedge clk) +begin : rcvr_CurrentState + if (rst) + CurrState_rcvr <= `START_SRX; + else + CurrState_rcvr <= NextState_rcvr; +end + +//---------------------------------- +// Registered outputs logic +//---------------------------------- +always @ (posedge clk) +begin : rcvr_RegOutput + if (rst) + begin + RXStMachCurrState <= `DISCONNECT_ST; + RXWaitCount <= 8'h00; + RxBits <= 2'b00; + connectState <= `DISCONNECT; + end + else + begin + RXStMachCurrState <= next_RXStMachCurrState; + RXWaitCount <= next_RXWaitCount; + RxBits <= next_RxBits; + connectState <= next_connectState; + end +end + +endmodule \ No newline at end of file Index: Actel/usbDeviceActelTop/hdl/fifoRTL.v =================================================================== --- Actel/usbDeviceActelTop/hdl/fifoRTL.v (nonexistent) +++ Actel/usbDeviceActelTop/hdl/fifoRTL.v (revision 40) @@ -0,0 +1,164 @@ +////////////////////////////////////////////////////////////////////// +//// //// +//// fifoRTL.v //// +//// //// +//// This file is part of the usbhostslave opencores effort. +//// //// +//// //// +//// Module Description: //// +//// parameterized dual clock domain fifo. +//// fifo depth is restricted to 2^ADDR_WIDTH +//// No protection against over runs and under runs. +//// +//// //// +//// To Do: //// +//// +//// //// +//// Author(s): //// +//// - Steve Fielding, sfielding@base2designs.com //// +//// //// +////////////////////////////////////////////////////////////////////// +//// //// +//// Copyright (C) 2004 Steve Fielding and OPENCORES.ORG //// +//// //// +//// This source file may be used and distributed without //// +//// restriction provided that this copyright statement is not //// +//// removed from the file and that any derivative work contains //// +//// the original copyright notice and the associated disclaimer. //// +//// //// +//// This source file is free software; you can redistribute it //// +//// and/or modify it under the terms of the GNU Lesser General //// +//// Public License as published by the Free Software Foundation; //// +//// either version 2.1 of the License, or (at your option) any //// +//// later version. //// +//// //// +//// This source is distributed in the hope that it will be //// +//// useful, but WITHOUT ANY WARRANTY; without even the implied //// +//// warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR //// +//// PURPOSE. See the GNU Lesser General Public License for more //// +//// details. //// +//// //// +//// You should have received a copy of the GNU Lesser General //// +//// Public License along with this source; if not, download it //// +//// from //// +//// //// +////////////////////////////////////////////////////////////////////// +// +`include "timescale.v" + +module fifoRTL(wrClk, rdClk, rstSyncToWrClk, rstSyncToRdClk, dataIn, + dataOut, fifoWEn, fifoREn, fifoFull, fifoEmpty, + forceEmptySyncToWrClk, forceEmptySyncToRdClk, numElementsInFifo); +//FIFO_DEPTH = ADDR_WIDTH^2. Min = 2, Max = 66536 + parameter FIFO_WIDTH = 8; + parameter FIFO_DEPTH = 64; + parameter ADDR_WIDTH = 6; + +// Two clock domains within this module +// These ports are within 'wrClk' domain +input wrClk; +input rstSyncToWrClk; +input [FIFO_WIDTH-1:0] dataIn; +input fifoWEn; +input forceEmptySyncToWrClk; +output fifoFull; + +// These ports are within 'rdClk' domain +input rdClk; +input rstSyncToRdClk; +output [FIFO_WIDTH-1:0] dataOut; +input fifoREn; +input forceEmptySyncToRdClk; +output fifoEmpty; +output [15:0]numElementsInFifo; //note that this implies a max fifo depth of 65536 + +wire wrClk; +wire rdClk; +wire rstSyncToWrClk; +wire rstSyncToRdClk; +wire [FIFO_WIDTH-1:0] dataIn; +reg [FIFO_WIDTH-1:0] dataOut; +wire fifoWEn; +wire fifoREn; +reg fifoFull; +reg fifoEmpty; +wire forceEmpty; +reg [15:0]numElementsInFifo; + + +// local registers +reg [ADDR_WIDTH:0]bufferInIndex; +reg [ADDR_WIDTH:0]bufferInIndexSyncToRdClk; +reg [ADDR_WIDTH:0]bufferOutIndex; +reg [ADDR_WIDTH:0]bufferOutIndexSyncToWrClk; +reg [ADDR_WIDTH-1:0]bufferInIndexToMem; +reg [ADDR_WIDTH-1:0]bufferOutIndexToMem; +reg [ADDR_WIDTH:0]bufferCnt; +reg fifoREnDelayed; +wire [FIFO_WIDTH-1:0] dataFromMem; + +always @(posedge wrClk) +begin + bufferOutIndexSyncToWrClk <= bufferOutIndex; + if (rstSyncToWrClk == 1'b1 || forceEmptySyncToWrClk == 1'b1) + begin + fifoFull <= 1'b0; + bufferInIndex <= 0; + end + else + begin + if (fifoWEn == 1'b1) begin + bufferInIndex <= bufferInIndex + 1'b1; + end + if ((bufferOutIndexSyncToWrClk[ADDR_WIDTH-1:0] == bufferInIndex[ADDR_WIDTH-1:0]) && + (bufferOutIndexSyncToWrClk[ADDR_WIDTH] != bufferInIndex[ADDR_WIDTH]) ) + fifoFull <= 1'b1; + else + fifoFull <= 1'b0; + end +end + +always @(bufferInIndexSyncToRdClk or bufferOutIndex) + bufferCnt <= bufferInIndexSyncToRdClk - bufferOutIndex; + +always @(posedge rdClk) +begin + numElementsInFifo <= { {16-ADDR_WIDTH+1{1'b0}}, bufferCnt }; //pad bufferCnt with leading zeroes + bufferInIndexSyncToRdClk <= bufferInIndex; + if (rstSyncToRdClk == 1'b1 || forceEmptySyncToRdClk == 1'b1) + begin + fifoEmpty <= 1'b1; + bufferOutIndex <= 0; + fifoREnDelayed <= 1'b0; + end + else + begin + fifoREnDelayed <= fifoREn; + if (fifoREn == 1'b1 && fifoREnDelayed == 1'b0) begin + dataOut <= dataFromMem; + bufferOutIndex <= bufferOutIndex + 1'b1; + end + if (bufferInIndexSyncToRdClk == bufferOutIndex) + fifoEmpty <= 1'b1; + else + fifoEmpty <= 1'b0; + end +end + + +always @(bufferInIndex or bufferOutIndex) begin + bufferInIndexToMem <= bufferInIndex[ADDR_WIDTH-1:0]; + bufferOutIndexToMem <= bufferOutIndex[ADDR_WIDTH-1:0]; +end + +dpMem_dc #(FIFO_WIDTH, FIFO_DEPTH, ADDR_WIDTH) u_dpMem_dc ( + .addrIn(bufferInIndexToMem), + .addrOut(bufferOutIndexToMem), + .wrClk(wrClk), + .rdClk(rdClk), + .dataIn(dataIn), + .writeEn(fifoWEn), + .readEn(fifoREn), + .dataOut(dataFromMem)); + +endmodule Index: Actel/usbDeviceActelTop/hdl/usbTxWireArbiter.v =================================================================== --- Actel/usbDeviceActelTop/hdl/usbTxWireArbiter.v (nonexistent) +++ Actel/usbDeviceActelTop/hdl/usbTxWireArbiter.v (revision 40) @@ -0,0 +1,213 @@ + +// File : ../RTL/serialInterfaceEngine/usbTxWireArbiter.v +// Generated : 11/10/06 05:37:24 +// From : ../RTL/serialInterfaceEngine/usbTxWireArbiter.asf +// By : FSM2VHDL ver. 5.0.0.9 + +////////////////////////////////////////////////////////////////////// +//// //// +//// usbTxWireArbiter +//// //// +//// This file is part of the usbhostslave opencores effort. +//// http://www.opencores.org/cores/usbhostslave/ //// +//// //// +//// Module Description: //// +//// +//// //// +//// To Do: //// +//// +//// //// +//// Author(s): //// +//// - Steve Fielding, sfielding@base2designs.com //// +//// //// +////////////////////////////////////////////////////////////////////// +//// //// +//// Copyright (C) 2004 Steve Fielding and OPENCORES.ORG //// +//// //// +//// This source file may be used and distributed without //// +//// restriction provided that this copyright statement is not //// +//// removed from the file and that any derivative work contains //// +//// the original copyright notice and the associated disclaimer. //// +//// //// +//// This source file is free software; you can redistribute it //// +//// and/or modify it under the terms of the GNU Lesser General //// +//// Public License as published by the Free Software Foundation; //// +//// either version 2.1 of the License, or (at your option) any //// +//// later version. //// +//// //// +//// This source is distributed in the hope that it will be //// +//// useful, but WITHOUT ANY WARRANTY; without even the implied //// +//// warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR //// +//// PURPOSE. See the GNU Lesser General Public License for more //// +//// details. //// +//// //// +//// You should have received a copy of the GNU Lesser General //// +//// Public License along with this source; if not, download it //// +//// from http://www.opencores.org/lgpl.shtml //// +//// //// +////////////////////////////////////////////////////////////////////// +// +`include "timescale.v" +`include "usbConstants_h.v" +`include "usbSerialInterfaceEngine_h.v" + + + +module USBTxWireArbiter (SIETxCtrl, SIETxData, SIETxFSRate, SIETxGnt, SIETxReq, SIETxWEn, TxBits, TxCtl, TxFSRate, USBWireRdyIn, USBWireRdyOut, USBWireWEn, clk, prcTxByteCtrl, prcTxByteData, prcTxByteFSRate, prcTxByteGnt, prcTxByteReq, prcTxByteWEn, rst); +input SIETxCtrl; +input [1:0] SIETxData; +input SIETxFSRate; +input SIETxReq; +input SIETxWEn; +input USBWireRdyIn; +input clk; +input prcTxByteCtrl; +input [1:0] prcTxByteData; +input prcTxByteFSRate; +input prcTxByteReq; +input prcTxByteWEn; +input rst; +output SIETxGnt; +output [1:0] TxBits; +output TxCtl; +output TxFSRate; +output USBWireRdyOut; +output USBWireWEn; +output prcTxByteGnt; + +wire SIETxCtrl; +wire [1:0] SIETxData; +wire SIETxFSRate; +reg SIETxGnt, next_SIETxGnt; +wire SIETxReq; +wire SIETxWEn; +reg [1:0] TxBits, next_TxBits; +reg TxCtl, next_TxCtl; +reg TxFSRate, next_TxFSRate; +wire USBWireRdyIn; +reg USBWireRdyOut, next_USBWireRdyOut; +reg USBWireWEn, next_USBWireWEn; +wire clk; +wire prcTxByteCtrl; +wire [1:0] prcTxByteData; +wire prcTxByteFSRate; +reg prcTxByteGnt, next_prcTxByteGnt; +wire prcTxByteReq; +wire prcTxByteWEn; +wire rst; + +// diagram signals declarations +reg muxSIENotPTXB, next_muxSIENotPTXB; + +// BINARY ENCODED state machine: txWireArb +// State codes definitions: +`define START_TARB 2'b00 +`define TARB_WAIT_REQ 2'b01 +`define PTXB_ACT 2'b10 +`define SIE_TX_ACT 2'b11 + +reg [1:0] CurrState_txWireArb; +reg [1:0] NextState_txWireArb; + +// Diagram actions (continuous assignments allowed only: assign ...) + +// processTxByte/SIETransmitter mux +always @(USBWireRdyIn) +begin + USBWireRdyOut <= USBWireRdyIn; +end +always @(muxSIENotPTXB or SIETxWEn or SIETxData or +SIETxCtrl or prcTxByteWEn or prcTxByteData or prcTxByteCtrl or +SIETxFSRate or prcTxByteFSRate) +begin + if (muxSIENotPTXB == 1'b1) + begin + USBWireWEn <= SIETxWEn; + TxBits <= SIETxData; + TxCtl <= SIETxCtrl; + TxFSRate <= SIETxFSRate; + end + else + begin + USBWireWEn <= prcTxByteWEn; + TxBits <= prcTxByteData; + TxCtl <= prcTxByteCtrl; + TxFSRate <= prcTxByteFSRate; + end +end + +//-------------------------------------------------------------------- +// Machine: txWireArb +//-------------------------------------------------------------------- +//---------------------------------- +// Next State Logic (combinatorial) +//---------------------------------- +always @ (prcTxByteReq or SIETxReq or prcTxByteGnt or muxSIENotPTXB or SIETxGnt or CurrState_txWireArb) +begin : txWireArb_NextState + NextState_txWireArb <= CurrState_txWireArb; + // Set default values for outputs and signals + next_prcTxByteGnt <= prcTxByteGnt; + next_muxSIENotPTXB <= muxSIENotPTXB; + next_SIETxGnt <= SIETxGnt; + case (CurrState_txWireArb) + `START_TARB: + NextState_txWireArb <= `TARB_WAIT_REQ; + `TARB_WAIT_REQ: + if (prcTxByteReq == 1'b1) + begin + NextState_txWireArb <= `PTXB_ACT; + next_prcTxByteGnt <= 1'b1; + next_muxSIENotPTXB <= 1'b0; + end + else if (SIETxReq == 1'b1) + begin + NextState_txWireArb <= `SIE_TX_ACT; + next_SIETxGnt <= 1'b1; + next_muxSIENotPTXB <= 1'b1; + end + `PTXB_ACT: + if (prcTxByteReq == 1'b0) + begin + NextState_txWireArb <= `TARB_WAIT_REQ; + next_prcTxByteGnt <= 1'b0; + end + `SIE_TX_ACT: + if (SIETxReq == 1'b0) + begin + NextState_txWireArb <= `TARB_WAIT_REQ; + next_SIETxGnt <= 1'b0; + end + endcase +end + +//---------------------------------- +// Current State Logic (sequential) +//---------------------------------- +always @ (posedge clk) +begin : txWireArb_CurrentState + if (rst) + CurrState_txWireArb <= `START_TARB; + else + CurrState_txWireArb <= NextState_txWireArb; +end + +//---------------------------------- +// Registered outputs logic +//---------------------------------- +always @ (posedge clk) +begin : txWireArb_RegOutput + if (rst) + begin + muxSIENotPTXB <= 1'b0; + prcTxByteGnt <= 1'b0; + SIETxGnt <= 1'b0; + end + else + begin + muxSIENotPTXB <= next_muxSIENotPTXB; + prcTxByteGnt <= next_prcTxByteGnt; + SIETxGnt <= next_SIETxGnt; + end +end + +endmodule \ No newline at end of file Index: Actel/usbDeviceActelTop/hdl/timescale.v =================================================================== --- Actel/usbDeviceActelTop/hdl/timescale.v (nonexistent) +++ Actel/usbDeviceActelTop/hdl/timescale.v (revision 40) @@ -0,0 +1,5 @@ +////////////////////////////////////////////////////////////////////// +// timescale.v +////////////////////////////////////////////////////////////////////// +`timescale 1ns / 1ps + Index: Actel/usbDeviceActelTop/hdl/slaveDirectcontrol.v =================================================================== --- Actel/usbDeviceActelTop/hdl/slaveDirectcontrol.v (nonexistent) +++ Actel/usbDeviceActelTop/hdl/slaveDirectcontrol.v (revision 40) @@ -0,0 +1,197 @@ + +// File : ../RTL/slaveController/slaveDirectcontrol.v +// Generated : 11/10/06 05:37:25 +// From : ../RTL/slaveController/slaveDirectcontrol.asf +// By : FSM2VHDL ver. 5.0.0.9 + +////////////////////////////////////////////////////////////////////// +//// //// +//// slaveDirectControl +//// //// +//// This file is part of the usbhostslave opencores effort. +//// http://www.opencores.org/cores/usbhostslave/ //// +//// //// +//// Module Description: //// +//// +//// //// +//// To Do: //// +//// +//// //// +//// Author(s): //// +//// - Steve Fielding, sfielding@base2designs.com //// +//// //// +////////////////////////////////////////////////////////////////////// +//// //// +//// Copyright (C) 2004 Steve Fielding and OPENCORES.ORG //// +//// //// +//// This source file may be used and distributed without //// +//// restriction provided that this copyright statement is not //// +//// removed from the file and that any derivative work contains //// +//// the original copyright notice and the associated disclaimer. //// +//// //// +//// This source file is free software; you can redistribute it //// +//// and/or modify it under the terms of the GNU Lesser General //// +//// Public License as published by the Free Software Foundation; //// +//// either version 2.1 of the License, or (at your option) any //// +//// later version. //// +//// //// +//// This source is distributed in the hope that it will be //// +//// useful, but WITHOUT ANY WARRANTY; without even the implied //// +//// warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR //// +//// PURPOSE. See the GNU Lesser General Public License for more //// +//// details. //// +//// //// +//// You should have received a copy of the GNU Lesser General //// +//// Public License along with this source; if not, download it //// +//// from http://www.opencores.org/lgpl.shtml //// +//// //// +////////////////////////////////////////////////////////////////////// +// +// +`include "timescale.v" +`include "usbSerialInterfaceEngine_h.v" + +module slaveDirectControl (SCTxPortCntl, SCTxPortData, SCTxPortGnt, SCTxPortRdy, SCTxPortReq, SCTxPortWEn, clk, directControlEn, directControlLineState, rst); +input SCTxPortGnt; +input SCTxPortRdy; +input clk; +input directControlEn; +input [1:0] directControlLineState; +input rst; +output [7:0] SCTxPortCntl; +output [7:0] SCTxPortData; +output SCTxPortReq; +output SCTxPortWEn; + +reg [7:0] SCTxPortCntl, next_SCTxPortCntl; +reg [7:0] SCTxPortData, next_SCTxPortData; +wire SCTxPortGnt; +wire SCTxPortRdy; +reg SCTxPortReq, next_SCTxPortReq; +reg SCTxPortWEn, next_SCTxPortWEn; +wire clk; +wire directControlEn; +wire [1:0] directControlLineState; +wire rst; + +// BINARY ENCODED state machine: slvDrctCntl +// State codes definitions: +`define START_SDC 3'b000 +`define CHK_DRCT_CNTL 3'b001 +`define DRCT_CNTL_WAIT_GNT 3'b010 +`define DRCT_CNTL_CHK_LOOP 3'b011 +`define DRCT_CNTL_WAIT_RDY 3'b100 +`define IDLE_FIN 3'b101 +`define IDLE_WAIT_GNT 3'b110 +`define IDLE_WAIT_RDY 3'b111 + +reg [2:0] CurrState_slvDrctCntl; +reg [2:0] NextState_slvDrctCntl; + +// Diagram actions (continuous assignments allowed only: assign ...) + +// diagram ACTION + +//-------------------------------------------------------------------- +// Machine: slvDrctCntl +//-------------------------------------------------------------------- +//---------------------------------- +// Next State Logic (combinatorial) +//---------------------------------- +always @ (directControlLineState or directControlEn or SCTxPortGnt or SCTxPortRdy or SCTxPortReq or SCTxPortWEn or SCTxPortData or SCTxPortCntl or CurrState_slvDrctCntl) +begin : slvDrctCntl_NextState + NextState_slvDrctCntl <= CurrState_slvDrctCntl; + // Set default values for outputs and signals + next_SCTxPortReq <= SCTxPortReq; + next_SCTxPortWEn <= SCTxPortWEn; + next_SCTxPortData <= SCTxPortData; + next_SCTxPortCntl <= SCTxPortCntl; + case (CurrState_slvDrctCntl) + `START_SDC: + NextState_slvDrctCntl <= `CHK_DRCT_CNTL; + `CHK_DRCT_CNTL: + if (directControlEn == 1'b1) + begin + NextState_slvDrctCntl <= `DRCT_CNTL_WAIT_GNT; + next_SCTxPortReq <= 1'b1; + end + else + begin + NextState_slvDrctCntl <= `IDLE_WAIT_GNT; + next_SCTxPortReq <= 1'b1; + end + `DRCT_CNTL_WAIT_GNT: + if (SCTxPortGnt == 1'b1) + NextState_slvDrctCntl <= `DRCT_CNTL_WAIT_RDY; + `DRCT_CNTL_CHK_LOOP: + begin + next_SCTxPortWEn <= 1'b0; + if (directControlEn == 1'b0) + begin + NextState_slvDrctCntl <= `CHK_DRCT_CNTL; + next_SCTxPortReq <= 1'b0; + end + else + NextState_slvDrctCntl <= `DRCT_CNTL_WAIT_RDY; + end + `DRCT_CNTL_WAIT_RDY: + if (SCTxPortRdy == 1'b1) + begin + NextState_slvDrctCntl <= `DRCT_CNTL_CHK_LOOP; + next_SCTxPortWEn <= 1'b1; + next_SCTxPortData <= {6'b000000, directControlLineState}; + next_SCTxPortCntl <= `TX_DIRECT_CONTROL; + end + `IDLE_FIN: + begin + next_SCTxPortWEn <= 1'b0; + next_SCTxPortReq <= 1'b0; + NextState_slvDrctCntl <= `CHK_DRCT_CNTL; + end + `IDLE_WAIT_GNT: + if (SCTxPortGnt == 1'b1) + NextState_slvDrctCntl <= `IDLE_WAIT_RDY; + `IDLE_WAIT_RDY: + if (SCTxPortRdy == 1'b1) + begin + NextState_slvDrctCntl <= `IDLE_FIN; + next_SCTxPortWEn <= 1'b1; + next_SCTxPortData <= 8'h00; + next_SCTxPortCntl <= `TX_IDLE; + end + endcase +end + +//---------------------------------- +// Current State Logic (sequential) +//---------------------------------- +always @ (posedge clk) +begin : slvDrctCntl_CurrentState + if (rst) + CurrState_slvDrctCntl <= `START_SDC; + else + CurrState_slvDrctCntl <= NextState_slvDrctCntl; +end + +//---------------------------------- +// Registered outputs logic +//---------------------------------- +always @ (posedge clk) +begin : slvDrctCntl_RegOutput + if (rst) + begin + SCTxPortCntl <= 8'h00; + SCTxPortData <= 8'h00; + SCTxPortWEn <= 1'b0; + SCTxPortReq <= 1'b0; + end + else + begin + SCTxPortCntl <= next_SCTxPortCntl; + SCTxPortData <= next_SCTxPortData; + SCTxPortWEn <= next_SCTxPortWEn; + SCTxPortReq <= next_SCTxPortReq; + end +end + +endmodule \ No newline at end of file Index: Actel/usbDeviceActelTop/hdl/usbSerialInterfaceEngine_h.v =================================================================== --- Actel/usbDeviceActelTop/hdl/usbSerialInterfaceEngine_h.v (nonexistent) +++ Actel/usbDeviceActelTop/hdl/usbSerialInterfaceEngine_h.v (revision 40) @@ -0,0 +1,108 @@ +////////////////////////////////////////////////////////////////////// +// usbSerialInterfaceEngine_h.v +////////////////////////////////////////////////////////////////////// + +`ifdef usbSerialInterfaceEngine_h_vdefined +`else +`define usbSerialInterfaceEngine_h_vdefined + + // Sampling frequency = 'FS_OVER_SAMPLE_RATE' * full speed bit rate = 'LS_OVER_SAMPLE_RATE' * low speed bit rate +`define FS_OVER_SAMPLE_RATE 4 +`define LS_OVER_SAMPLE_RATE 32 + +//timeOuts +`define RX_PACKET_TOUT 18 +`define RX_EDGE_DET_TOUT 7 + +//TXStreamControlTypes +`define TX_DIRECT_CONTROL 8'h00 +`define TX_RESUME_START 8'h01 +`define TX_PACKET_START 8'h02 +`define TX_PACKET_STREAM 8'h03 +`define TX_PACKET_STOP 8'h04 +`define TX_IDLE 8'h05 +`define TX_LS_KEEP_ALIVE 8'h06 + +//RXStreamControlTypes +`define RX_PACKET_START 0 +`define RX_PACKET_STREAM 1 +`define RX_PACKET_STOP 2 + +//USBLineStates +// ONE_ZERO corresponds to differential 1. ie D+ = Hi, D- = Lo +`define ONE_ZERO 2'b10 +`define ZERO_ONE 2'b01 +`define SE0 2'b00 +`define SE1 2'b11 + +//RXStatusIndices +`define CRC_ERROR_BIT 0 +`define BIT_STUFF_ERROR_BIT 1 +`define RX_OVERFLOW_BIT 2 +`define NAK_RXED_BIT 3 +`define STALL_RXED_BIT 4 +`define ACK_RXED_BIT 5 +`define DATA_SEQUENCE_BIT 6 + +//usbWireControlStates +`define TRI_STATE 1'b0 +`define DRIVE 1'b1 + +//limits +`define MAX_CONSEC_SAME_BITS 4'h6 +`define MAX_CONSEC_SAME_BITS_PLUS1 4'h7 +// RESUME_RX_WAIT_TIME defines the time period for resume detection +// The resume counter is incremented at the bit rate, so +// RESUME_RX_WAIT_TIME = 29 corresponds to 30 * 1/12MHz = 2.5uS at full speed +// and 30 * 1/1.5MHz = 20uS at low speed, both of which are within the USB spec of +// 2.5uS <= resumeDetectTime <= 100uS +`define RESUME_RX_WAIT_TIME 5'd29 +//`define RESUME_WAIT_TIME_MINUS1 9 +// 'HOST_TX_RESUME_TIME' assumes counter is incremented at low speed bit rate +`ifdef SIM_COMPILE +`define HOST_TX_RESUME_TIME 16'd10 +`else +`define HOST_TX_RESUME_TIME 16'd30000 //Host sends resume for 30000 * 1/1.5MHz = 20mS +`endif +//`define CONNECT_WAIT_TIME 8'd20 +`define CONNECT_WAIT_TIME 8'd120 //Device connect detected after 120 * 1/48MHz = 2.5uS +//`define DISCONNECT_WAIT_TIME 8'd20 +`define DISCONNECT_WAIT_TIME 8'd120 //Device disconnect detected after 120 * 1/48MHz = 2.5uS + +//RXConnectStates +`define DISCONNECT 2'b00 +`define LOW_SPEED_CONNECT 2'b01 +`define FULL_SPEED_CONNECT 2'b10 + +//TX_RX_InternalStreamTypes +`define DATA_START 8'h00 +`define DATA_STOP 8'h01 +`define DATA_STREAM 8'h02 +`define DATA_BIT_STUFF_ERROR 8'h03 + +//RXStMach states +`define DISCONNECT_ST 4'h0 +`define WAIT_FULL_SPEED_CONN_ST 4'h1 +`define WAIT_LOW_SPEED_CONN_ST 4'h2 +`define CONNECT_LOW_SPEED_ST 4'h3 +`define CONNECT_FULL_SPEED_ST 4'h4 +`define WAIT_LOW_SP_DISCONNECT_ST 4'h5 +`define WAIT_FULL_SP_DISCONNECT_ST 4'h6 + +//RXBitStateMachStates +`define IDLE_BIT_ST 2'b00 +`define DATA_RECEIVE_BIT_ST 2'b01 +`define WAIT_RESUME_ST 2'b10 +`define RESUME_END_WAIT_ST 2'b11 + +//RXByteStateMachStates +`define IDLE_BYTE_ST 3'b000 +`define CHECK_SYNC_ST 3'b001 +`define CHECK_PID_ST 3'b010 +`define HS_BYTE_ST 3'b011 +`define TOKEN_BYTE_ST 3'b100 +`define DATA_BYTE_ST 3'b101 + +`endif //usbSerialInterfaceEngine_h_vdefined + + Index: Actel/usbDeviceActelTop/hdl/RxFifoBI.v =================================================================== --- Actel/usbDeviceActelTop/hdl/RxFifoBI.v (nonexistent) +++ Actel/usbDeviceActelTop/hdl/RxFifoBI.v (revision 40) @@ -0,0 +1,154 @@ +////////////////////////////////////////////////////////////////////// +//// //// +//// RxfifoBI.v //// +//// //// +//// This file is part of the usbhostslave opencores effort. +//// //// +//// //// +//// Module Description: //// +//// +//// //// +//// To Do: //// +//// +//// //// +//// Author(s): //// +//// - Steve Fielding, sfielding@base2designs.com //// +//// //// +////////////////////////////////////////////////////////////////////// +//// //// +//// Copyright (C) 2004 Steve Fielding and OPENCORES.ORG //// +//// //// +//// This source file may be used and distributed without //// +//// restriction provided that this copyright statement is not //// +//// removed from the file and that any derivative work contains //// +//// the original copyright notice and the associated disclaimer. //// +//// //// +//// This source file is free software; you can redistribute it //// +//// and/or modify it under the terms of the GNU Lesser General //// +//// Public License as published by the Free Software Foundation; //// +//// either version 2.1 of the License, or (at your option) any //// +//// later version. //// +//// //// +//// This source is distributed in the hope that it will be //// +//// useful, but WITHOUT ANY WARRANTY; without even the implied //// +//// warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR //// +//// PURPOSE. See the GNU Lesser General Public License for more //// +//// details. //// +//// //// +//// You should have received a copy of the GNU Lesser General //// +//// Public License along with this source; if not, download it //// +//// from //// +//// //// +////////////////////////////////////////////////////////////////////// +// +`include "timescale.v" +`include "wishBoneBus_h.v" + +module RxfifoBI ( + address, + writeEn, + strobe_i, + busClk, + usbClk, + rstSyncToBusClk, + fifoSelect, + fifoDataIn, + busDataIn, + busDataOut, + fifoREn, + forceEmptySyncToUsbClk, + forceEmptySyncToBusClk, + numElementsInFifo + ); +input [2:0] address; +input writeEn; +input strobe_i; +input busClk; +input usbClk; +input rstSyncToBusClk; +input [7:0] fifoDataIn; +input [7:0] busDataIn; +output [7:0] busDataOut; +output fifoREn; +output forceEmptySyncToUsbClk; +output forceEmptySyncToBusClk; +input [15:0] numElementsInFifo; +input fifoSelect; + + +wire [2:0] address; +wire writeEn; +wire strobe_i; +wire busClk; +wire usbClk; +wire rstSyncToBusClk; +wire [7:0] fifoDataIn; +wire [7:0] busDataIn; +reg [7:0] busDataOut; +reg fifoREn; +wire forceEmptySyncToUsbClk; +wire forceEmptySyncToBusClk; +wire [15:0] numElementsInFifo; +wire fifoSelect; + +reg forceEmptyReg; +reg forceEmpty; +reg forceEmptyToggle; +reg [2:0] forceEmptyToggleSyncToUsbClk; + +//sync write +always @(posedge busClk) +begin + if (writeEn == 1'b1 && fifoSelect == 1'b1 && + address == `FIFO_CONTROL_REG && strobe_i == 1'b1 && busDataIn[0] == 1'b1) + forceEmpty <= 1'b1; + else + forceEmpty <= 1'b0; +end + +//detect rising edge of 'forceEmpty', and generate toggle signal +always @(posedge busClk) begin + if (rstSyncToBusClk == 1'b1) begin + forceEmptyReg <= 1'b0; + forceEmptyToggle <= 1'b0; + end + else begin + if (forceEmpty == 1'b1) + forceEmptyReg <= 1'b1; + else + forceEmptyReg <= 1'b0; + if (forceEmpty == 1'b1 && forceEmptyReg == 1'b0) + forceEmptyToggle <= ~forceEmptyToggle; + end +end +assign forceEmptySyncToBusClk = (forceEmpty == 1'b1 && forceEmptyReg == 1'b0) ? 1'b1 : 1'b0; + + +// double sync across clock domains to generate 'forceEmptySyncToUsbClk' +always @(posedge usbClk) begin + forceEmptyToggleSyncToUsbClk <= {forceEmptyToggleSyncToUsbClk[1:0], forceEmptyToggle}; +end +assign forceEmptySyncToUsbClk = forceEmptyToggleSyncToUsbClk[2] ^ forceEmptyToggleSyncToUsbClk[1]; + +// async read mux +always @(address or fifoDataIn or numElementsInFifo) +begin + case (address) + `FIFO_DATA_REG : busDataOut <= fifoDataIn; + `FIFO_DATA_COUNT_MSB : busDataOut <= numElementsInFifo[15:8]; + `FIFO_DATA_COUNT_LSB : busDataOut <= numElementsInFifo[7:0]; + default: busDataOut <= 8'h00; + endcase +end + +//generate fifo read strobe +always @(address or writeEn or strobe_i or fifoSelect) begin + if (address == `FIFO_DATA_REG && writeEn == 1'b0 && + strobe_i == 1'b1 && fifoSelect == 1'b1) + fifoREn <= 1'b1; + else + fifoREn <= 1'b0; +end + + +endmodule Index: Actel/usbDeviceActelTop/hdl/dpMem_dc.v =================================================================== --- Actel/usbDeviceActelTop/hdl/dpMem_dc.v (nonexistent) +++ Actel/usbDeviceActelTop/hdl/dpMem_dc.v (revision 40) @@ -0,0 +1,84 @@ +////////////////////////////////////////////////////////////////////// +//// //// +//// dpMem_dc.v //// +//// //// +//// This file is part of the usbhostslave opencores effort. +//// //// +//// //// +//// Module Description: //// +//// Synchronous dual port memory with dual clocks +//// //// +//// To Do: //// +//// +//// //// +//// Author(s): //// +//// - Steve Fielding, sfielding@base2designs.com //// +//// //// +////////////////////////////////////////////////////////////////////// +//// //// +//// Copyright (C) 2004 Steve Fielding and OPENCORES.ORG //// +//// //// +//// This source file may be used and distributed without //// +//// restriction provided that this copyright statement is not //// +//// removed from the file and that any derivative work contains //// +//// the original copyright notice and the associated disclaimer. //// +//// //// +//// This source file is free software; you can redistribute it //// +//// and/or modify it under the terms of the GNU Lesser General //// +//// Public License as published by the Free Software Foundation; //// +//// either version 2.1 of the License, or (at your option) any //// +//// later version. //// +//// //// +//// This source is distributed in the hope that it will be //// +//// useful, but WITHOUT ANY WARRANTY; without even the implied //// +//// warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR //// +//// PURPOSE. See the GNU Lesser General Public License for more //// +//// details. //// +//// //// +//// You should have received a copy of the GNU Lesser General //// +//// Public License along with this source; if not, download it //// +//// from //// +//// //// +////////////////////////////////////////////////////////////////////// +// +`include "timescale.v" + +module dpMem_dc( addrIn, addrOut, wrClk, rdClk, dataIn, writeEn, readEn, dataOut); + //FIFO_DEPTH = ADDR_WIDTH^2 + parameter FIFO_WIDTH = 8; + parameter FIFO_DEPTH = 64; + parameter ADDR_WIDTH = 6; + +input wrClk; +input rdClk; +input [FIFO_WIDTH-1:0] dataIn; +output [FIFO_WIDTH-1:0] dataOut; +input writeEn; +input readEn; +input [ADDR_WIDTH-1:0] addrIn; +input [ADDR_WIDTH-1:0] addrOut; + +wire wrClk; +wire rdClk; +wire [FIFO_WIDTH-1:0] dataIn; +reg [FIFO_WIDTH-1:0] dataOut; +wire writeEn; +wire readEn; +wire [ADDR_WIDTH-1:0] addrIn; +wire [ADDR_WIDTH-1:0] addrOut; + +reg [FIFO_WIDTH-1:0] buffer [0:FIFO_DEPTH-1]; + +// synchronous read. Introduces one clock cycle delay +always @(posedge rdClk) begin + dataOut <= buffer[addrOut]; +end + +// synchronous write +always @(posedge wrClk) begin + if (writeEn == 1'b1) + buffer[addrIn] <= dataIn; +end + + +endmodule Index: Actel/usbDeviceActelTop/hdl/usbDevice.v =================================================================== --- Actel/usbDeviceActelTop/hdl/usbDevice.v (nonexistent) +++ Actel/usbDeviceActelTop/hdl/usbDevice.v (revision 40) @@ -0,0 +1,231 @@ +////////////////////////////////////////////////////////////////////// +//// //// +//// usbDevice.v //// +//// //// +//// This file is part of the usbHostSlave opencores effort. +//// //// +//// //// +//// Module Description: //// +//// Top level module for usbDevice +//// Instantiates a usbSlave, and controllers for EP0 and EP1 +//// If you wish to implement another type of HID, then you will +//// need to modify usbROM.v, and EP1Mouse.v +//// //// +//// To Do: //// +//// +//// //// +//// Author(s): //// +//// - Steve Fielding, sfielding@base2designs.com //// +//// //// +////////////////////////////////////////////////////////////////////// +//// //// +//// Copyright (C) 2008 Steve Fielding and OPENCORES.ORG //// +//// //// +//// This source file may be used and distributed without //// +//// restriction provided that this copyright statement is not //// +//// removed from the file and that any derivative work contains //// +//// the original copyright notice and the associated disclaimer. //// +//// //// +//// This source file is free software; you can redistribute it //// +//// and/or modify it under the terms of the GNU Lesser General //// +//// Public License as published by the Free Software Foundation; //// +//// either version 2.1 of the License, or (at your option) any //// +//// later version. //// +//// //// +//// This source is distributed in the hope that it will be //// +//// useful, but WITHOUT ANY WARRANTY; without even the implied //// +//// warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR //// +//// PURPOSE. See the GNU Lesser General Public License for more //// +//// details. //// +//// //// +//// You should have received a copy of the GNU Lesser General //// +//// Public License along with this source; if not, download it //// +//// from //// +//// //// +////////////////////////////////////////////////////////////////////// +// + +module usbDevice ( + clk, + rst, + usbSlaveVP_in, + usbSlaveVM_in, + usbSlaveVP_out, + usbSlaveVM_out, + usbSlaveOE_n, + usbDPlusPullup, + vBusDetect +); + +input clk; +input rst; +input usbSlaveVP_in; +input usbSlaveVM_in; +output usbSlaveVP_out; +output usbSlaveVM_out; +output usbSlaveOE_n; +output usbDPlusPullup; +input vBusDetect; + +//local wires and regs +wire [7:0] wb_addr0; +wire wb_stb0; +wire wb_we0; +wire wbBusReq0; +wire wbBusGnt0; +wire [7:0] wb_addr1; +wire [7:0] wb_data_o1; +wire wb_stb1; +wire wb_we1; +wire wbBusReq1; +wire wbBusGnt1; +wire [7:0] wb_addr2; +wire [7:0] wb_data_o2; +wire wb_stb2; +wire wb_we2; +wire wbBusReq2; +wire wbBusGnt2; +wire [7:0] wb_adr; +wire [7:0] wb_dat_to_usb; +wire [7:0] wb_dat_from_usb; +wire wb_we; +wire wb_stb; +wire wb_ack; +reg [1:0] resetReg; +wire initComplete; +wire usbRstDet; +wire [7:0] memAddr; +wire [7:0] memData; +wire USBWireCtrlOut; +wire [1:0] USBWireDataIn; +wire [1:0] USBWireDataOut; + + +//Parameters declaration: +defparam usbSlaveInst.EP0_FIFO_DEPTH = 64; +defparam usbSlaveInst.EP0_FIFO_ADDR_WIDTH = 6; +defparam usbSlaveInst.EP1_FIFO_DEPTH = 64; +defparam usbSlaveInst.EP1_FIFO_ADDR_WIDTH = 6; +defparam usbSlaveInst.EP2_FIFO_DEPTH = 64; +defparam usbSlaveInst.EP2_FIFO_ADDR_WIDTH = 6; +defparam usbSlaveInst.EP3_FIFO_DEPTH = 64; +defparam usbSlaveInst.EP3_FIFO_ADDR_WIDTH = 6; +usbSlave usbSlaveInst ( + .clk_i(clk), + .rst_i(rst), + .address_i(wb_adr), + .data_i(wb_dat_to_usb), + .data_o(wb_dat_from_usb), + .we_i(wb_we), + .strobe_i(wb_stb), + .ack_o(wb_ack), + .usbClk(clk), + .slaveSOFRxedIntOut(), + .slaveResetEventIntOut(), + .slaveResumeIntOut(), + .slaveTransDoneIntOut(), + .slaveNAKSentIntOut(), + .slaveVBusDetIntOut(), + .USBWireDataIn(USBWireDataIn), + .USBWireDataInTick(), + .USBWireDataOut(USBWireDataOut), + .USBWireDataOutTick(), + .USBWireCtrlOut(USBWireCtrlOut), + .USBFullSpeed(), + .USBDPlusPullup(usbDPlusPullup), + .USBDMinusPullup(), + .vBusDetect(vBusDetect) +); + +assign USBWireDataIn = {usbSlaveVP_in, usbSlaveVM_in}; +assign {usbSlaveVP_out, usbSlaveVM_out} = USBWireDataOut; +assign usbSlaveOE_n = ~USBWireCtrlOut; + +checkLineState u_checkLineState ( + .clk(clk), + .rst(rst), + .initComplete(initComplete), + .usbRstDet(usbRstDet), + .wb_ack(wb_ack), + .wb_addr(wb_addr0), + .wb_data_i(wb_dat_from_usb), + .wb_stb(wb_stb0), + .wb_we(wb_we0), + .wbBusGnt(wbBusGnt0), + .wbBusReq(wbBusReq0) +); + + +EP0 u_EP0 ( + .clk(clk), + .rst(rst | usbRstDet), + .initComplete(initComplete), + .wb_ack(wb_ack), + .wb_addr(wb_addr1), + .wb_data_i(wb_dat_from_usb), + .wb_data_o(wb_data_o1), + .wb_stb(wb_stb1), + .wb_we(wb_we1), + .wbBusGnt(wbBusGnt1), + .wbBusReq(wbBusReq1), + .memAddr(memAddr), + .memData(memData), + .memRdEn() +); + +usbROM u_usbROM ( + .clk(clk), + .addr(memAddr), + .data(memData) +); + + +EP1Mouse u_EP1Mouse ( + .clk(clk), + .rst(rst | usbRstDet), + .initComplete(initComplete), + .wb_ack(wb_ack), + .wb_addr(wb_addr2), + .wb_data_i(wb_dat_from_usb), + .wb_data_o(wb_data_o2), + .wb_stb(wb_stb2), + .wb_we(wb_we2), + .wbBusGnt(wbBusGnt2), + .wbBusReq(wbBusReq2) +); + +wishboneArb u_wishboneArb ( + .clk(clk), + .rst(rst), + + .addr0_i(wb_addr0), + .data0_i(8'h00), + .stb0_i(wb_stb0), + .we0_i(wb_we0), + .req0(wbBusReq0), + .gnt0(wbBusGnt0), + + .addr1_i(wb_addr1), + .data1_i(wb_data_o1), + .stb1_i(wb_stb1), + .we1_i(wb_we1), + .req1(wbBusReq1), + .gnt1(wbBusGnt1), + + .addr2_i(wb_addr2), + .data2_i(wb_data_o2), + .stb2_i(wb_stb2), + .we2_i(wb_we2), + .req2(wbBusReq2), + .gnt2(wbBusGnt2), + + + .addr_o(wb_adr), + .data_o(wb_dat_to_usb), + .stb_o(wb_stb), + .we_o(wb_we) +); + + +endmodule + Index: Actel/usbDeviceActelTop/hdl/TxFifoBI.v =================================================================== --- Actel/usbDeviceActelTop/hdl/TxFifoBI.v (nonexistent) +++ Actel/usbDeviceActelTop/hdl/TxFifoBI.v (revision 40) @@ -0,0 +1,149 @@ +////////////////////////////////////////////////////////////////////// +//// //// +//// TxfifoBI.v //// +//// //// +//// This file is part of the usbhostslave opencores effort. +//// //// +//// //// +//// Module Description: //// +//// +//// //// +//// To Do: //// +//// +//// //// +//// Author(s): //// +//// - Steve Fielding, sfielding@base2designs.com //// +//// //// +////////////////////////////////////////////////////////////////////// +//// //// +//// Copyright (C) 2004 Steve Fielding and OPENCORES.ORG //// +//// //// +//// This source file may be used and distributed without //// +//// restriction provided that this copyright statement is not //// +//// removed from the file and that any derivative work contains //// +//// the original copyright notice and the associated disclaimer. //// +//// //// +//// This source file is free software; you can redistribute it //// +//// and/or modify it under the terms of the GNU Lesser General //// +//// Public License as published by the Free Software Foundation; //// +//// either version 2.1 of the License, or (at your option) any //// +//// later version. //// +//// //// +//// This source is distributed in the hope that it will be //// +//// useful, but WITHOUT ANY WARRANTY; without even the implied //// +//// warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR //// +//// PURPOSE. See the GNU Lesser General Public License for more //// +//// details. //// +//// //// +//// You should have received a copy of the GNU Lesser General //// +//// Public License along with this source; if not, download it //// +//// from //// +//// //// +////////////////////////////////////////////////////////////////////// +// +`include "timescale.v" +`include "wishBoneBus_h.v" + +module TxfifoBI ( + address, writeEn, strobe_i, + busClk, + usbClk, + rstSyncToBusClk, + fifoSelect, + busDataIn, + busDataOut, + fifoWEn, + forceEmptySyncToUsbClk, + forceEmptySyncToBusClk, + numElementsInFifo + ); +input [2:0] address; +input writeEn; +input strobe_i; +input busClk; +input usbClk; +input rstSyncToBusClk; +input [7:0] busDataIn; +output [7:0] busDataOut; +output fifoWEn; +output forceEmptySyncToUsbClk; +output forceEmptySyncToBusClk; +input [15:0] numElementsInFifo; +input fifoSelect; + + +wire [2:0] address; +wire writeEn; +wire strobe_i; +wire busClk; +wire usbClk; +wire rstSyncToBusClk; +wire [7:0] busDataIn; +wire [7:0] busDataOut; +reg fifoWEn; +wire forceEmptySyncToUsbClk; +wire forceEmptySyncToBusClk; +wire [15:0] numElementsInFifo; +wire fifoSelect; + +reg forceEmptyReg; +reg forceEmpty; +reg forceEmptyToggle; +reg [2:0] forceEmptyToggleSyncToUsbClk; + +//sync write +always @(posedge busClk) +begin + if (writeEn == 1'b1 && fifoSelect == 1'b1 && + address == `FIFO_CONTROL_REG && strobe_i == 1'b1 && busDataIn[0] == 1'b1) + forceEmpty <= 1'b1; + else + forceEmpty <= 1'b0; +end + +//detect rising edge of 'forceEmpty', and generate toggle signal +always @(posedge busClk) begin + if (rstSyncToBusClk == 1'b1) begin + forceEmptyReg <= 1'b0; + forceEmptyToggle <= 1'b0; + end + else begin + if (forceEmpty == 1'b1) + forceEmptyReg <= 1'b1; + else + forceEmptyReg <= 1'b0; + if (forceEmpty == 1'b1 && forceEmptyReg == 1'b0) + forceEmptyToggle <= ~forceEmptyToggle; + end +end +assign forceEmptySyncToBusClk = (forceEmpty == 1'b1 && forceEmptyReg == 1'b0) ? 1'b1 : 1'b0; + +// double sync across clock domains to generate 'forceEmptySyncToUsbClk' +always @(posedge usbClk) begin + forceEmptyToggleSyncToUsbClk <= {forceEmptyToggleSyncToUsbClk[1:0], forceEmptyToggle}; +end +assign forceEmptySyncToUsbClk = forceEmptyToggleSyncToUsbClk[2] ^ forceEmptyToggleSyncToUsbClk[1]; + +// async read mux +assign busDataOut = 8'h00; +//always @(address or fifoFull or numElementsInFifo) +//begin +// case (address) +// `FIFO_STATUS_REG : busDataOut <= {7'b0000000, fifoFull}; +// `FIFO_DATA_COUNT_MSB : busDataOut <= numElementsInFifo[15:8]; +// `FIFO_DATA_COUNT_LSB : busDataOut <= numElementsInFifo[7:0]; +// default: busDataOut <= 8'h00; +// endcase +//end + +//generate fifo write strobe +always @(address or writeEn or strobe_i or fifoSelect or busDataIn) begin + if (address == `FIFO_DATA_REG && writeEn == 1'b1 && + strobe_i == 1'b1 && fifoSelect == 1'b1) + fifoWEn <= 1'b1; + else + fifoWEn <= 1'b0; +end + + +endmodule Index: Actel/usbDeviceActelTop/synthesis/usbDeviceActelTop_syn.prj =================================================================== --- Actel/usbDeviceActelTop/synthesis/usbDeviceActelTop_syn.prj (nonexistent) +++ Actel/usbDeviceActelTop/synthesis/usbDeviceActelTop_syn.prj (revision 40) @@ -0,0 +1,62 @@ +#add_file options +add_file -_include "C:/datasheets/Opencores/usbHostSlave_new/usbhostslave/usbDevice/syn/Actel/usbDeviceActelTop/hdl/timescale.v" +add_file -_include "C:/datasheets/Opencores/usbHostSlave_new/usbhostslave/usbDevice/syn/Actel/usbDeviceActelTop/hdl/usbSlaveControl_h.v" +add_file -_include "C:/datasheets/Opencores/usbHostSlave_new/usbhostslave/usbDevice/syn/Actel/usbDeviceActelTop/hdl/usbSerialInterfaceEngine_h.v" +add_file -_include "C:/datasheets/Opencores/usbHostSlave_new/usbhostslave/usbDevice/syn/Actel/usbDeviceActelTop/hdl/usbConstants_h.v" +add_file -_include "C:/datasheets/Opencores/usbHostSlave_new/usbhostslave/usbDevice/syn/Actel/usbDeviceActelTop/hdl/wishBoneBus_h.v" +add_file -_include "C:/datasheets/Opencores/usbHostSlave_new/usbhostslave/usbDevice/syn/Actel/usbDeviceActelTop/hdl/usbHostSlave_h.v" +add_file -_include "C:/datasheets/Opencores/usbHostSlave_new/usbhostslave/usbDevice/syn/Actel/usbDeviceActelTop/hdl/usbHostSlaveReg_define.v" +add_file -_include "C:/datasheets/Opencores/usbHostSlave_new/usbhostslave/usbDevice/syn/Actel/usbDeviceActelTop/hdl/usbDevice_define.v" +add_file -verilog "C:/datasheets/Opencores/usbHostSlave_new/usbhostslave/usbDevice/syn/Actel/usbDeviceActelTop/hdl/USBSlaveControlBI.v" +add_file -verilog "C:/datasheets/Opencores/usbHostSlave_new/usbhostslave/usbDevice/syn/Actel/usbDeviceActelTop/hdl/slavecontroller.v" +add_file -verilog "C:/datasheets/Opencores/usbHostSlave_new/usbhostslave/usbDevice/syn/Actel/usbDeviceActelTop/hdl/endpMux.v" +add_file -verilog "C:/datasheets/Opencores/usbHostSlave_new/usbhostslave/usbDevice/syn/Actel/usbDeviceActelTop/hdl/slaveSendpacket.v" +add_file -verilog "C:/datasheets/Opencores/usbHostSlave_new/usbhostslave/usbDevice/syn/Actel/usbDeviceActelTop/hdl/slaveDirectcontrol.v" +add_file -verilog "C:/datasheets/Opencores/usbHostSlave_new/usbhostslave/usbDevice/syn/Actel/usbDeviceActelTop/hdl/sctxportarbiter.v" +add_file -verilog "C:/datasheets/Opencores/usbHostSlave_new/usbhostslave/usbDevice/syn/Actel/usbDeviceActelTop/hdl/slaveGetpacket.v" +add_file -verilog "C:/datasheets/Opencores/usbHostSlave_new/usbhostslave/usbDevice/syn/Actel/usbDeviceActelTop/hdl/slaveRxStatusMonitor.v" +add_file -verilog "C:/datasheets/Opencores/usbHostSlave_new/usbhostslave/usbDevice/syn/Actel/usbDeviceActelTop/hdl/fifoMux.v" +add_file -verilog "C:/datasheets/Opencores/usbHostSlave_new/usbhostslave/usbDevice/syn/Actel/usbDeviceActelTop/hdl/usbSlaveControl.v" +add_file -verilog "C:/datasheets/Opencores/usbHostSlave_new/usbhostslave/usbDevice/syn/Actel/usbDeviceActelTop/hdl/wishBoneBI.v" +add_file -verilog "C:/datasheets/Opencores/usbHostSlave_new/usbhostslave/usbDevice/syn/Actel/usbDeviceActelTop/hdl/hostSlaveMuxBI.v" +add_file -verilog "C:/datasheets/Opencores/usbHostSlave_new/usbhostslave/usbDevice/syn/Actel/usbDeviceActelTop/hdl/lineControlUpdate.v" +add_file -verilog "C:/datasheets/Opencores/usbHostSlave_new/usbhostslave/usbDevice/syn/Actel/usbDeviceActelTop/hdl/siereceiver.v" +add_file -verilog "C:/datasheets/Opencores/usbHostSlave_new/usbhostslave/usbDevice/syn/Actel/usbDeviceActelTop/hdl/processRxBit.v" +add_file -verilog "C:/datasheets/Opencores/usbHostSlave_new/usbhostslave/usbDevice/syn/Actel/usbDeviceActelTop/hdl/processRxByte.v" +add_file -verilog "C:/datasheets/Opencores/usbHostSlave_new/usbhostslave/usbDevice/syn/Actel/usbDeviceActelTop/hdl/updateCRC5.v" +add_file -verilog "C:/datasheets/Opencores/usbHostSlave_new/usbhostslave/usbDevice/syn/Actel/usbDeviceActelTop/hdl/updateCRC16.v" +add_file -verilog "C:/datasheets/Opencores/usbHostSlave_new/usbhostslave/usbDevice/syn/Actel/usbDeviceActelTop/hdl/SIETransmitter.v" +add_file -verilog "C:/datasheets/Opencores/usbHostSlave_new/usbhostslave/usbDevice/syn/Actel/usbDeviceActelTop/hdl/processTxByte.v" +add_file -verilog "C:/datasheets/Opencores/usbHostSlave_new/usbhostslave/usbDevice/syn/Actel/usbDeviceActelTop/hdl/usbTxWireArbiter.v" +add_file -verilog "C:/datasheets/Opencores/usbHostSlave_new/usbhostslave/usbDevice/syn/Actel/usbDeviceActelTop/hdl/writeUSBWireData.v" +add_file -verilog "C:/datasheets/Opencores/usbHostSlave_new/usbhostslave/usbDevice/syn/Actel/usbDeviceActelTop/hdl/readUSBWireData.v" +add_file -verilog "C:/datasheets/Opencores/usbHostSlave_new/usbhostslave/usbDevice/syn/Actel/usbDeviceActelTop/hdl/usbSerialInterfaceEngine.v" +add_file -verilog "C:/datasheets/Opencores/usbHostSlave_new/usbhostslave/usbDevice/syn/Actel/usbDeviceActelTop/hdl/dpMem_dc.v" +add_file -verilog "C:/datasheets/Opencores/usbHostSlave_new/usbhostslave/usbDevice/syn/Actel/usbDeviceActelTop/hdl/fifoRTL.v" +add_file -verilog "C:/datasheets/Opencores/usbHostSlave_new/usbhostslave/usbDevice/syn/Actel/usbDeviceActelTop/hdl/TxFifoBI.v" +add_file -verilog "C:/datasheets/Opencores/usbHostSlave_new/usbhostslave/usbDevice/syn/Actel/usbDeviceActelTop/hdl/TxFifo.v" +add_file -verilog "C:/datasheets/Opencores/usbHostSlave_new/usbhostslave/usbDevice/syn/Actel/usbDeviceActelTop/hdl/RxFifoBI.v" +add_file -verilog "C:/datasheets/Opencores/usbHostSlave_new/usbhostslave/usbDevice/syn/Actel/usbDeviceActelTop/hdl/RxFifo.v" +add_file -verilog "C:/datasheets/Opencores/usbHostSlave_new/usbhostslave/usbDevice/syn/Actel/usbDeviceActelTop/hdl/usbSlave.v" +add_file -verilog "C:/datasheets/Opencores/usbHostSlave_new/usbhostslave/usbDevice/syn/Actel/usbDeviceActelTop/hdl/checkLineState.v" +add_file -verilog "C:/datasheets/Opencores/usbHostSlave_new/usbhostslave/usbDevice/syn/Actel/usbDeviceActelTop/hdl/EP0.v" +add_file -verilog "C:/datasheets/Opencores/usbHostSlave_new/usbhostslave/usbDevice/syn/Actel/usbDeviceActelTop/hdl/usbROM.v" +add_file -verilog "C:/datasheets/Opencores/usbHostSlave_new/usbhostslave/usbDevice/syn/Actel/usbDeviceActelTop/hdl/EP1Mouse.v" +add_file -verilog "C:/datasheets/Opencores/usbHostSlave_new/usbhostslave/usbDevice/syn/Actel/usbDeviceActelTop/hdl/wishboneArb.v" +add_file -verilog "C:/datasheets/Opencores/usbHostSlave_new/usbhostslave/usbDevice/syn/Actel/usbDeviceActelTop/hdl/usbDevice.v" +add_file -verilog "C:/datasheets/Opencores/usbHostSlave_new/usbhostslave/usbDevice/syn/Actel/usbDeviceActelTop/hdl/usbDeviceActelTop.v" +set_option -top_module usbDeviceActelTop + +#device options +set_option -technology IGLOO +set_option -part AGL600V5 + +#compilation/mapping options +set_option -symbolic_fsm_compiler true + +#compilation/mapping options +set_option -frequency 100.000 + +#simulation options +impl -active "synthesis" +project -result_file "C:/datasheets/Opencores/usbHostSlave_new/usbhostslave/usbDevice/syn/Actel/usbDeviceActelTop/synthesis/usbDeviceActelTop.edn" Index: xilinx/usbDeviceXilinxTop/pll_48MHz_xilinx.v =================================================================== --- xilinx/usbDeviceXilinxTop/pll_48MHz_xilinx.v (nonexistent) +++ xilinx/usbDeviceXilinxTop/pll_48MHz_xilinx.v (revision 40) @@ -0,0 +1,78 @@ +//////////////////////////////////////////////////////////////////////////////// +// Copyright (c) 1995-2007 Xilinx, Inc. All rights reserved. +//////////////////////////////////////////////////////////////////////////////// +// ____ ____ +// / /\/ / +// /___/ \ / Vendor: Xilinx +// \ \ \/ Version : 9.2.03i +// \ \ Application : xaw2verilog +// / / Filename : pll_48MHz_xilinx.v +// /___/ /\ Timestamp : 08/20/2008 15:22:39 +// \ \ / \ +// \___\/\___\ +// +//Command: xaw2verilog -intstyle F:/version_ctrl/usbhostslave/usbDevice/syn/xilinx/usbDeviceXilinxTop/pll_48MHz_xilinx.xaw -st pll_48MHz_xilinx.v +//Design Name: pll_48MHz_xilinx +//Device: xc3s700a-5fg484 +// +// Module pll_48MHz_xilinx +// Generated by Xilinx Architecture Wizard +// Written for synthesis tool: XST +`timescale 1ns / 1ps + +module pll_48MHz_xilinx(CLKIN_IN, + CLKIN_IBUFG_OUT, + CLK0_OUT, + LOCKED_OUT); + + input CLKIN_IN; + output CLKIN_IBUFG_OUT; + output CLK0_OUT; + output LOCKED_OUT; + + wire CLKFB_IN; + wire CLKIN_IBUFG; + wire CLK0_BUF; + wire GND_BIT; + + assign GND_BIT = 0; + assign CLKIN_IBUFG_OUT = CLKIN_IBUFG; + assign CLK0_OUT = CLKFB_IN; + IBUFG CLKIN_IBUFG_INST (.I(CLKIN_IN), + .O(CLKIN_IBUFG)); + BUFG CLK0_BUFG_INST (.I(CLK0_BUF), + .O(CLKFB_IN)); + DCM_SP DCM_SP_INST (.CLKFB(CLKFB_IN), + .CLKIN(CLKIN_IBUFG), + .DSSEN(GND_BIT), + .PSCLK(GND_BIT), + .PSEN(GND_BIT), + .PSINCDEC(GND_BIT), + .RST(GND_BIT), + .CLKDV(), + .CLKFX(), + .CLKFX180(), + .CLK0(CLK0_BUF), + .CLK2X(), + .CLK2X180(), + .CLK90(), + .CLK180(), + .CLK270(), + .LOCKED(LOCKED_OUT), + .PSDONE(), + .STATUS()); + defparam DCM_SP_INST.CLK_FEEDBACK = "1X"; + defparam DCM_SP_INST.CLKDV_DIVIDE = 2.0; + defparam DCM_SP_INST.CLKFX_DIVIDE = 1; + defparam DCM_SP_INST.CLKFX_MULTIPLY = 4; + defparam DCM_SP_INST.CLKIN_DIVIDE_BY_2 = "FALSE"; + defparam DCM_SP_INST.CLKIN_PERIOD = 20.833; + defparam DCM_SP_INST.CLKOUT_PHASE_SHIFT = "NONE"; + defparam DCM_SP_INST.DESKEW_ADJUST = "SYSTEM_SYNCHRONOUS"; + defparam DCM_SP_INST.DFS_FREQUENCY_MODE = "LOW"; + defparam DCM_SP_INST.DLL_FREQUENCY_MODE = "LOW"; + defparam DCM_SP_INST.DUTY_CYCLE_CORRECTION = "TRUE"; + defparam DCM_SP_INST.FACTORY_JF = 16'hC080; + defparam DCM_SP_INST.PHASE_SHIFT = 0; + defparam DCM_SP_INST.STARTUP_WAIT = "FALSE"; +endmodule Index: xilinx/usbDeviceXilinxTop/usbDeviceXilinxTop.prj =================================================================== --- xilinx/usbDeviceXilinxTop/usbDeviceXilinxTop.prj (nonexistent) +++ xilinx/usbDeviceXilinxTop/usbDeviceXilinxTop.prj (revision 40) @@ -0,0 +1,39 @@ +verilog work "../../../../RTL/buffers/dpMem_dc.v" +verilog work "../../../../RTL/slaveController/slavecontroller.v" +verilog work "../../../../RTL/slaveController/slaveSendpacket.v" +verilog work "../../../../RTL/slaveController/slaveRxStatusMonitor.v" +verilog work "../../../../RTL/slaveController/slaveGetpacket.v" +verilog work "../../../../RTL/slaveController/slaveDirectcontrol.v" +verilog work "../../../../RTL/slaveController/sctxportarbiter.v" +verilog work "../../../../RTL/slaveController/fifoMux.v" +verilog work "../../../../RTL/slaveController/endpMux.v" +verilog work "../../../../RTL/slaveController/USBSlaveControlBI.v" +verilog work "../../../../RTL/serialInterfaceEngine/writeUSBWireData.v" +verilog work "../../../../RTL/serialInterfaceEngine/usbTxWireArbiter.v" +verilog work "../../../../RTL/serialInterfaceEngine/updateCRC5.v" +verilog work "../../../../RTL/serialInterfaceEngine/updateCRC16.v" +verilog work "../../../../RTL/serialInterfaceEngine/siereceiver.v" +verilog work "../../../../RTL/serialInterfaceEngine/readUSBWireData.v" +verilog work "../../../../RTL/serialInterfaceEngine/processTxByte.v" +verilog work "../../../../RTL/serialInterfaceEngine/processRxByte.v" +verilog work "../../../../RTL/serialInterfaceEngine/processRxBit.v" +verilog work "../../../../RTL/serialInterfaceEngine/lineControlUpdate.v" +verilog work "../../../../RTL/serialInterfaceEngine/SIETransmitter.v" +verilog work "../../../../RTL/buffers/fifoRTL.v" +verilog work "../../../../RTL/buffers/TxFifoBI.v" +verilog work "../../../../RTL/buffers/RxFifoBI.v" +verilog work "../../../../RTL/slaveController/usbSlaveControl.v" +verilog work "../../../../RTL/serialInterfaceEngine/usbSerialInterfaceEngine.v" +verilog work "../../../../RTL/hostSlaveMux/hostSlaveMuxBI.v" +verilog work "../../../../RTL/busInterface/wishBoneBI.v" +verilog work "../../../../RTL/buffers/TxFifo.v" +verilog work "../../../../RTL/buffers/RxFifo.v" +verilog work "../../../RTL/wishboneArb.v" +verilog work "../../../RTL/usbROM.v" +verilog work "../../../RTL/checkLineState.v" +verilog work "../../../RTL/EP1Mouse.v" +verilog work "../../../RTL/EP0.v" +verilog work "../../../../RTL/wrapper/usbSlave.v" +verilog work "pll_48MHz_xilinx.v" +verilog work "../../../RTL/usbDevice.v" +verilog work "../../../RTL/usbDeviceXilinxTop.v" Index: xilinx/usbDeviceXilinxTop/usbDeviceXilinxTop.ucf =================================================================== --- xilinx/usbDeviceXilinxTop/usbDeviceXilinxTop.ucf (nonexistent) +++ xilinx/usbDeviceXilinxTop/usbDeviceXilinxTop.ucf (revision 40) @@ -0,0 +1,144 @@ +############################################################################## +## Copyright (c) 2006, 2007 Xilinx, Inc. +## This design is confidential and proprietary of Xilinx, All Rights Reserved. +############################################################################## +## ____ ____ +## / /\/ / +## /___/ \ / Vendor: Xilinx +## \ \ \/ Version: 1.0.1 +## \ \ Filename: starter_kit_constraints.ucf +## / / Date Created: December 25, 2006 +## /___/ /\ Last Modified: April 1, 2007 +## \ \ / \ +## \___\/\___\ +## +## Devices: Spartan-3 Generation FPGA +## Purpose: Complete constraint file for Spartan-3A(N) Starter Kit +## Contact: crabill@xilinx.com +## Reference: None +## +## Revision History: +## Rev 1.0.0 - (crabill) Created December 25, 2006 for PCB revision C. +## Rev 1.0.1 - (crabill) Modified April 1, 2007 to mention revision D +## of the PCB and applicability to Spartan-3AN. +## +############################################################################## +## +## LIMITED WARRANTY AND DISCLAIMER. These designs are provided to you "as is". +## Xilinx and its licensors make and you receive no warranties or conditions, +## express, implied, statutory or otherwise, and Xilinx specifically disclaims +## any implied warranties of merchantability, non-infringement, or fitness for +## a particular purpose. Xilinx does not warrant that the functions contained +## in these designs will meet your requirements, or that the operation of +## these designs will be uninterrupted or error free, or that defects in the +## designs will be corrected. Furthermore, Xilinx does not warrant or make any +## representations regarding use or the results of the use of the designs in +## terms of correctness, accuracy, reliability, or otherwise. +## +## LIMITATION OF LIABILITY. In no event will Xilinx or its licensors be liable +## for any loss of data, lost profits, cost or procurement of substitute goods +## or services, or for any special, incidental, consequential, or indirect +## damages arising from the use or operation of the designs or accompanying +## documentation, however caused and on any theory of liability. This +## limitation will apply even if Xilinx has been advised of the possibility +## of such damage. This limitation shall apply not-withstanding the failure +## of the essential purpose of any limited remedies herein. +## +############################################################################## +## Copyright (c) 2006, 2007 Xilinx, Inc. +## This design is confidential and proprietary of Xilinx, All Rights Reserved. +############################################################################## + +# On this board, VCCAUX is 3.3 volts. + +CONFIG VCCAUX = "3.3" ; + +# Configure SUSPEND mode options. + +CONFIG ENABLE_SUSPEND = "FILTERED" ; + +# FILTERED is appropriate for use with the switch on this board. Other allowed +# settings are NO or UNFILTERED. If set NO, the AWAKE pin becomes general I/O. +# Please read the FPGA User Guide for more information. + +# Configure POST_CRC options. + +CONFIG POST_CRC = "DISABLE" ; + +# DISABLE the post-configuration CRC checking so INIT_B is available for +# general I/O after configuration is done. On this board, INIT_B is used +# after configuration to control the Platform Flash device. Other allowed +# settings are ENABLE. Please read the FPGA User Guide for more information. + +############################################################################## +# These are sample constraints for the three clock inputs. You will need +# to change these constraints to suit your application. Please read the +# FPGA Development System Reference Guide for more information on expressing +# timing constraints for your design. +############################################################################## + + +NET "clk" LOC = "V12" | IOSTANDARD = LVCMOS33 | PERIOD = 20.830 ; +OFFSET = IN 10.410 VALID 20.830 BEFORE "clk" ; +OFFSET = OUT 20.830 AFTER "clk" ; + + + + + + +############################################################################## +# Accessory Headers (J18, J19, J20) +############################################################################## + +#NET "J18_IO<1>" LOC = "AA21" | IOSTANDARD = LVCMOS33 | DRIVE = 8 | SLEW = SLOW ; +#NET "J18_IO<2>" LOC = "AB21" | IOSTANDARD = LVCMOS33 | DRIVE = 8 | SLEW = SLOW ; +#NET "J18_IO<3>" LOC = "AA19" | IOSTANDARD = LVCMOS33 | DRIVE = 8 | SLEW = SLOW ; +#NET "J18_IO<4>" LOC = "AB19" | IOSTANDARD = LVCMOS33 | DRIVE = 8 | SLEW = SLOW ; +NET "usbSlaveVP" LOC = "AA21" | IOSTANDARD = LVCMOS33 | DRIVE = 8 | SLEW = SLOW ; +NET "usbSlaveVM" LOC = "AB21" | IOSTANDARD = LVCMOS33 | DRIVE = 8 | SLEW = SLOW ; +NET "usbSlaveOE_n" LOC = "AA19" | IOSTANDARD = LVCMOS33 | DRIVE = 8 | SLEW = SLOW ; +NET "usbDPlusPullup" LOC = "AB19" | IOSTANDARD = LVCMOS33 | DRIVE = 8 | SLEW = SLOW ; + +#NET "J19_IO<1>" LOC = "Y18" | IOSTANDARD = LVCMOS33 | DRIVE = 8 | SLEW = SLOW ; +#NET "J19_IO<2>" LOC = "W18" | IOSTANDARD = LVCMOS33 | DRIVE = 8 | SLEW = SLOW ; +#NET "J19_IO<3>" LOC = "V17" | IOSTANDARD = LVCMOS33 | DRIVE = 8 | SLEW = SLOW ; +#NET "J19_IO<4>" LOC = "W17" | IOSTANDARD = LVCMOS33 | DRIVE = 8 | SLEW = SLOW ; + +#NET "J20_IO<1>" LOC = "V14" | IOSTANDARD = LVCMOS33 | DRIVE = 8 | SLEW = SLOW ; +#NET "J20_IO<2>" LOC = "V15" | IOSTANDARD = LVCMOS33 | DRIVE = 8 | SLEW = SLOW ; +#NET "J20_IO<3>" LOC = "W16" | IOSTANDARD = LVCMOS33 | DRIVE = 8 | SLEW = SLOW ; +#NET "J20_IO<4>" LOC = "V16" | IOSTANDARD = LVCMOS33 | DRIVE = 8 | SLEW = SLOW ; + + + + + +############################################################################## +# 10/100 Ethernet (E) +############################################################################## + + +NET "E_NRST" LOC = "D15" | IOSTANDARD = LVCMOS33 | DRIVE = 8 | SLEW = SLOW ; + +############################################################################## +# Serial Peripheral System +############################################################################## + +NET "SPI_SCK" LOC = "AA20" | IOSTANDARD = LVCMOS33 | DRIVE = 8 | SLEW = SLOW ; + +############################################################################## +# Parallel Flash (NF) +############################################################################## + +NET "NF_CE" LOC = "W20" | IOSTANDARD = LVCMOS33 | DRIVE = 8 | SLEW = SLOW ; + + +############################################################################## +# DDR2 SDRAM Device (SD) +############################################################################## + +NET "SD_CS" LOC = "M5" | IOSTANDARD = SSTL18_I ; + + +############################################################################## Index: xilinx/usbDeviceXilinxTop/usbDeviceXilinxTop.ise =================================================================== Cannot display: file marked as a binary type. svn:mime-type = application/octet-stream Index: xilinx/usbDeviceXilinxTop/usbDeviceXilinxTop.ise =================================================================== --- xilinx/usbDeviceXilinxTop/usbDeviceXilinxTop.ise (nonexistent) +++ xilinx/usbDeviceXilinxTop/usbDeviceXilinxTop.ise (revision 40)
xilinx/usbDeviceXilinxTop/usbDeviceXilinxTop.ise Property changes : Added: svn:mime-type ## -0,0 +1 ## +application/octet-stream \ No newline at end of property Index: xilinx/usbDeviceXilinxTop/pll_48MHz_xilinx.xaw =================================================================== Cannot display: file marked as a binary type. svn:mime-type = application/octet-stream Index: xilinx/usbDeviceXilinxTop/pll_48MHz_xilinx.xaw =================================================================== --- xilinx/usbDeviceXilinxTop/pll_48MHz_xilinx.xaw (nonexistent) +++ xilinx/usbDeviceXilinxTop/pll_48MHz_xilinx.xaw (revision 40)
xilinx/usbDeviceXilinxTop/pll_48MHz_xilinx.xaw Property changes : Added: svn:mime-type ## -0,0 +1 ## +application/octet-stream \ No newline at end of property Index: xilinx/usbDeviceXilinxTop/pll_48MHz_xilinx_arwz.ucf =================================================================== --- xilinx/usbDeviceXilinxTop/pll_48MHz_xilinx_arwz.ucf (nonexistent) +++ xilinx/usbDeviceXilinxTop/pll_48MHz_xilinx_arwz.ucf (revision 40) @@ -0,0 +1,17 @@ +# Generated by Xilinx Architecture Wizard +# --- UCF Template Only --- +# Cut and paste these attributes into the project's UCF file, if desired +INST DCM_SP_INST CLK_FEEDBACK = 1X; +INST DCM_SP_INST CLKDV_DIVIDE = 2.0; +INST DCM_SP_INST CLKFX_DIVIDE = 1; +INST DCM_SP_INST CLKFX_MULTIPLY = 4; +INST DCM_SP_INST CLKIN_DIVIDE_BY_2 = FALSE; +INST DCM_SP_INST CLKIN_PERIOD = 20.833; +INST DCM_SP_INST CLKOUT_PHASE_SHIFT = NONE; +INST DCM_SP_INST DESKEW_ADJUST = SYSTEM_SYNCHRONOUS; +INST DCM_SP_INST DFS_FREQUENCY_MODE = LOW; +INST DCM_SP_INST DLL_FREQUENCY_MODE = LOW; +INST DCM_SP_INST DUTY_CYCLE_CORRECTION = TRUE; +INST DCM_SP_INST FACTORY_JF = C080; +INST DCM_SP_INST PHASE_SHIFT = 0; +INST DCM_SP_INST STARTUP_WAIT = FALSE;

powered by: WebSVN 2.1.0

© copyright 1999-2024 OpenCores.org, equivalent to Oliscience, all rights reserved. OpenCores®, registered trademark.